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

2024-09-30 02:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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)像素不存在(可能会更改)。所以,我不能进行解密。 你知道为什么会发生这种情况吗?我怎样才能在不损失任何像素的情况下获得帧? 还是有其他方法可以做到这一点?由于项目提供的一些约束,我无法在外部文件中存储坐标


Tags: inimagefor视频os像素filesarray
1条回答
网友
1楼 · 发布于 2024-09-30 02:27:32

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

有损格式试图通过部分丢弃“不必要的”数据来压缩数据。您的(0,0,0)像素已被适当优化

您需要调查应该使用哪个底层编解码器(如指定给VideoWriter_fourcc(...))来实现您的目的。这种选择取决于它的无损性以及您的环境中提供的支持

相关问题 更多 >

    热门问题