基于摄像头采集环境图像帧间差异的真随机数生成方法
通过摄像头两帧图像采样,分析两帧图像中差异像素,并将像素灰度差异值转换为二进制比特作为随机比特
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位比特,可以说效率极高了