我想对视频中检测到的人脸进行加密,以保存身份。然后对该视频进行解密,以显示人脸。

问题描述 投票:0回答:1

我在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)像素,被标记的边界不存在(可能改变)。所以,我不能执行解密.你知道为什么会发生这种情况,我怎么能得到帧没有任何像素的损失?或者有什么其他方法可以做到这一点?由于项目提供的一些限制,我不能在外部文件中存储坐标。

python image-processing encryption video-processing lossless-compression
1个回答
0
投票

禽类 文件格式是一种容器格式,允许各种音频和视频编码格式。这些格式中有些是无损的,有些是有损的。

有损格式试图通过部分丢弃 "不必要的 "数据来压缩数据。你的(0,0,0)像素被适当地优化掉了。

你需要调查一下底层的编解码器(如指定的那样) VideoWriter_fourcc(...) )你应该使用服务器你的目的。这个选择取决于它是否是无损的以及你的环境所提供的支持。

© www.soinside.com 2019 - 2024. All rights reserved.