基于摄像头采集环境图像帧间差异的真随机数生成方法
通过摄像头两帧图像采样,分析两帧图像中差异像素,并将像素灰度差异值转换为二进制比特作为随机比特
import cv2
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
def process_frame(frame):
return frame
def get_img():
success, frame = cap.read()
success, frame2 = cap.read()
if not success:
print('error!')
#frame = process_frame(frame)
cv2.destroyAllWindows()
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
rst=[]
for i in gray:
for j in i:
rst.append(j)
gray2=cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
rst2=[]
for i in gray2:
for j in i:
rst2.append(j)
return rst,rst2
def main():
while(1):
rst1,rst2=pixel1=get_img()
#rst2=pixel2=get_img()
resu=[]
for i in range(len(rst1)):
if(rst1[i]!=rst2[i]):
resu.append(abs(rst1[i]-rst2[i])%2)
print("本轮生成二进制随机数位数:",len(resu))
output=""
for i in resu[:200]:
output=output+str(i)
print("随机数前200位为:",output)
cap.release()
if __name__ == '__main__':
main()收到环境噪声影响,相机采集到像素中的每个像素都可以发生不可预测的变化,作为真随机数产生的依据,生成效果如下图所示
丢弃帧间相同灰度的像素点
在摄像头采样率为24fps,像素为200w pixel的情况下,理论每秒最多可以生成24/2*2000000=2400w位比特,可以说效率极高了
