我正在尝试隐藏文本并从视频中检索文本。我的嵌入和检索方法适用于图像。该方法还适用于在使用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文件相同的帧