我正在用python工作,这就是我尝试过的-
- 使用OpenCv识别人脸并获取视频帧中人脸的坐标。
- 将该帧和坐标传递给加密算法(我正在使用混沌掩码(以仅在人脸周围的边界框内执行加密。
- 我没有将这些坐标保存在外部文件中以便可以在加密区域执行解密,而是选择通过将框边界上的像素值修改为 (0,0,0( 并在框中执行加密来标记框中人脸周围的边界框。
-
然后将加密帧保存在一个目录中,以便我可以借助以下代码从这些帧中获取新视频-
pathIn= './frames/' pathOut = 'videonew.avi' fps = 15 frame_array = [] files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))] #for sorting the frame names properly files.sort(key = lambda x: int(x[0:-4])) for i in range(len(files)): filename=pathIn + files[i] #reading each files img = cv2.imread(filename) height, width, layers = img.shape size = (width,height) #inserting the frames into an image array frame_array.append(img) out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size) for i in range(len(frame_array)): # writing to a image array out.write(frame_array[i]) out.release()
-
这工作正常,并创建了视频"videonew.avi"。现在,为了解密,我使用以下代码从"videonew.avi中提取帧。
vidcap = cv2.VideoCapture('videonew.avi') success,image = vidcap.read() count = 0 path = os.getcwd() + "/test" os.chdir(path) while success: cv2.imwrite("%d.png" % count, image) # save frame as PNGfile success,image = vidcap.read() # print('Read a new frame: ', success) count += 1
但是提取的帧会遭受某种压缩,并且在边界上标记的那些 (0,0,0( 像素不存在(可能已更改(。所以,我无法执行解密。 你知道为什么会发生这种情况,我怎样才能在不损失像素的情况下获得帧吗? 或者有没有其他方法可以做到这一点?由于项目提供的一些约束,我无法将坐标存储在外部文件中。
avi文件格式是一种容器格式,允许各种音频和视频编码格式。其中一些格式是无损的,其中一些是有损的。
有损格式试图通过部分丢弃"不必要的"数据来压缩数据。您的 (0,0,0( 像素已适当优化。
您需要调查应使用哪个底层编解码器(指定为VideoWriter_fourcc(...)
(来服务器您的目的。此选择取决于它是无损的以及您的环境中提供的支持。