这两天在运行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()
然后我发现保存的视频可以输出了。但是每一帧都没有图像,是这样的:
而我想要的是这个样:
我就又蒙了,因为我使用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的类型,结果如下:
果然,我现在的image需要处理一下才行,将imwrite代码更改为以下代码,保存的图片就是正常的了。
cv2.imwrite('video/result/frame/frame'+str(i)+'.jpg',image*255)
顺着这个思路,我将image=image*255,然后再用outCamera.write(image)写入,发现还是不对,这又让我卡住了,怎么图像变成了这样:
将image输出后
我觉得也没啥问题了啊,范围已经是0-255了,为什么还不对呢?这个时候我已经是不懂原理,在那瞎改了。既然前面对于图像的类型有要求,会不会还是我的数组里的数据有问题。于是我将所有的数又转换成了整数,结果如下:
好嘛,可算是正常点能看出个东西来了,但是这还是不对呀,怎么图像一条一条的,而且这好像是把每个图像裁剪了一样,怎么只有左上角呢?我又开始蒙了。
这时我又输出了一下image.dtype,显示是int32,嗯?改成int8试试吧!于是代码就变成了开头注释掉的那部分。
……
啊啊啊啊啊,终于改出来了啊,内心那个激动啊!
……
但是我这个菜鸡并不是很清楚为什么。。。反正我是知道了要八位整型才行,如果哪位大佬看见了可以给我讲讲为啥。
谢谢!