VideoWriter创建新视频后,BGR中的像素颜色值会略有偏移

时间:2018-12-25 17:38:31

标签: python opencv opencv3.0 steganography

我正在尝试隐藏文本并从视频中检索文本。我的嵌入和检索方法适用于图像。该方法还适用于在使用VideoWriter之前,在压缩之前的视频帧。

我尝试了在图像上的嵌入和检索方法。在使用VideoWriter之前,我在嵌入消息后立即打印出检索到的消息,从而在框架上进行了尝试-消息已成功检索。

我将new_frame中的颜色值与从output.avi检索到的帧进行了比较,它们略有不同,从而在检索时破坏了消息。

我阅读了色彩空间,BGR,RGB,YUV *类型。我想我仍然在BGR中。我不确定像素格式是否会影响这些颜色值。

FFV1是当前在我的系统上运行的唯一无损fourcc。我尝试使用.avi文件而不是.mov文件,但收到了类似的结果。 我尝试将'-1'作为我的fourcc并选择“全帧”,但尝试播放视频时,收到“无效的缓冲区大小,数据包大小3110400 <预期的帧大小8294400,所以我回到了FFV1。

我知道FFV1尚未标准化,可能会出现错误区域,但不确定现在该怎么办。

将消息嵌入视频

cap = cv2.VideoCapture("smartphone.mov")
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))   # float
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # float
fps = int(cap.get(cv2.CAP_PROP_FPS))
print(fps)
fourcc = cv2.VideoWriter_fourcc(*'FFV1')
out = cv2.VideoWriter('output.avi',fourcc, fps, (width, height))
cap.set(16,width)
cap.set(9, height)
i = 0
while(cap.isOpened()):
    # Capture frame-by-frame
    ret, frame = cap.read()
    if ret == False: break
    #print (frame.shape)
    #print (frame)
    new_frame = embedMessageInFrame(frame, a, b)
    global f
    if i == 0:
        f = new_frame
    #print(new_frame[5])

    #print(retrieveMessageInFrame(new_frame))
    out.write(new_frame)
    # cv2.imshow('frame',new_frame)
    i += 1
    if cv2.waitKey(fps) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

从视频中检索消息

cap = cv2.VideoCapture("output.avi")
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))   # float
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # float
fps = int(cap.get(cv2.CAP_PROP_FPS))
print(fps)
cap.set(16,width)
cap.set(9, height)
i = 0

while(cap.isOpened()):
    # Capture frame-by-frame
    ret, frame = cap.read()
    # print(ret)
    if ret == False: break
    # print (frame.shape)
    global nf
    if i == 0:
        nf = frame
    #print (frame)
    msg = retrieveMessageInFrame(frame)
    if msg != 0: print(msg)
    cv2.imshow('frame',frame)
    i += 1
    if cv2.waitKey(fps) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

retrieve方法应该具有与应该写入output.avi文件相同的帧

0 个答案:

没有答案