使用opencv保存视频时遇到的坑

这两天在运行PRNet的代码,由于源代码是对二维图像进行处理,所以自己改了一下,先读取视频的每一帧,然后将这一帧图像作为输入,调用prnet,再将网络的输出一帧帧保存成视频。按理说很简单的几行代码就可以完成,但是在使用opencv将输出的每一帧图像保存成视频时,问题就出现了。

首先我把我的部分代码放上来。image.shape=(1280,720,3)

cap = cv2.VideoCapture("video/huachunying.mp4")#打开视频
# 通过摄像头的方式
# cap=cv2.VideoCapture(0)

wid = int(cap.get(3))

hei = int(cap.get(4))

framerate = int(cap.get(5))
image=plot_kpt(image, kpt)
image_kpt.append(image)
fourcc = cv2.VideoWriter_fourcc(*'XVID')

framesize=(wid,hei)

outCamera = cv2.VideoWriter('video/result/outputCamera1.avi', fourcc, framerate, framesize)

for i in range(len(image_kpt)):
    image=image_kpt[i]
    cv2.imshow("frame",image)
    cv2.waitKey(int(1000/framerate))
    #image=(image*255).astype('int8')#这是改了半天改动的地方
    outCamera.write(image)
    
outCamera.release()
cv2.destroyAllWindows()#关闭窗口

运行后我发现保存的视频打不开,不是0kb就是6kb,这个问题百度了一下,问题在下面这段代码上:

framesize=(wid,hei)

outCamera = cv2.VideoWriter('video/result/outputCamera1.avi', fourcc, framerate, framesize)

这里的framesize应该是每一帧图像的(width,height),不要写反了!比如我的image.shape=(1280,720,3),而我的framesize应该是(720,1280)。

然后就是记得要释放掉VideoWriter

outCamera.release()

然后我发现保存的视频可以输出了。但是每一帧都没有图像,是这样的:

使用opencv保存视频时遇到的坑_第1张图片

而我想要的是这个样:

使用opencv保存视频时遇到的坑_第2张图片

我就又蒙了,因为我使用cv2.imshow是可以正确输出我的每一帧图像的,不知道为什么保存下来就错了,然后我就又用cv2.imwrite函数将每一帧图像保存到本地

for i in range(len(image_kpt)):
    image=image_kpt[i]
    print(image.dtype)
    cv2.imshow("frame",image)
    cv2.waitKey(int(1000/framerate))
    cv2.imwrite('video/result/frame/frame'+str(i)+'.jpg',image)
cv2.waitKey(0)

发现保存下来的图像除了68个关键点其余都是黑的,这时我想到prnet在处理时,将每一帧图像进行了一步操作

image = image/255.

然后又网上搜索了一下imshow和imwrite对图像的要求,发现了问题所在。这里参考这个链接Opencv-python(cv2)图像读取、显示与保存,看这一篇就够了

我输出了image和image的类型,结果如下:

使用opencv保存视频时遇到的坑_第3张图片

果然,我现在的image需要处理一下才行,将imwrite代码更改为以下代码,保存的图片就是正常的了。

cv2.imwrite('video/result/frame/frame'+str(i)+'.jpg',image*255)

顺着这个思路,我将image=image*255,然后再用outCamera.write(image)写入,发现还是不对,这又让我卡住了,怎么图像变成了这样:

使用opencv保存视频时遇到的坑_第4张图片

将image输出后

使用opencv保存视频时遇到的坑_第5张图片

我觉得也没啥问题了啊,范围已经是0-255了,为什么还不对呢?这个时候我已经是不懂原理,在那瞎改了。既然前面对于图像的类型有要求,会不会还是我的数组里的数据有问题。于是我将所有的数又转换成了整数,结果如下:

使用opencv保存视频时遇到的坑_第6张图片

好嘛,可算是正常点能看出个东西来了,但是这还是不对呀,怎么图像一条一条的,而且这好像是把每个图像裁剪了一样,怎么只有左上角呢?我又开始蒙了。

这时我又输出了一下image.dtype,显示是int32,嗯?改成int8试试吧!于是代码就变成了开头注释掉的那部分。

……

啊啊啊啊啊,终于改出来了啊,内心那个激动啊!

……

但是我这个菜鸡并不是很清楚为什么。。。反正我是知道了要八位整型才行,如果哪位大佬看见了可以给我讲讲为啥。

谢谢!

你可能感兴趣的:(opencv,python)