本篇文章基于
https://blog.csdn.net/u014361280/article/details/106157012
对其中一些错误进行指正。
下面先放上原文内的代码
import cv2 as cv
def main():
# 导入视频文件,参数:0 自带摄像头,1 USB摄像头,为文件名时读取视频文件
video_caputre = cv.VideoCapture(r"D:\CloudMusic\MV\排骨教主 - 入画.mp4")
# 获取读入视频的参数
fps = video_caputre.get(cv.CAP_PROP_FPS)
width = video_caputre.get(cv.CAP_PROP_FRAME_WIDTH)
height = video_caputre.get(cv.CAP_PROP_FRAME_HEIGHT)
print("fps:", fps)
print("width:", width)
print("height:", height)
# 定义截取尺寸,后面定义的每帧的h和w要于此一致,否则视频无法播放
# 注意 这里是高宽 (height, width)
size = (int(height), int(width / 2))
# 创建视频写入对象
videp_write = cv.VideoWriter("videoFrameTarget.avi", cv.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, size)
# 读取视频帧,然后写入文件并在窗口显示
success, frame_src = video_caputre.read()
while success and not cv.waitKey(1) == 27: #读完退出或者按下 esc 退出
# [width, height] 要与上面定义的size参数一致,注意参数的位置
frame_target = frame_src[0:int(width/2), 0:int(height)]
# 写入视频文件
videp_write.write(frame_target)
# 显示裁剪的视频和原视频
cv.imshow("video", frame_target)
cv.imshow("Video_src", frame_src)
# 不断读取
success, frame_src = video_caputre.read()
print("视频裁剪完成")
# 销毁窗口,释放资源
cv.destroyWindow("video")
cv.destroyWindow("Video_src")
video_caputre.release()
if __name__=="__main__":
main()
其中写到
# 注意 这里是高宽 (height, width)
size = (int(height), int(width / 2))
在我实际的使用中发现是错误的,他的文章里有显示运行结果。
仔细查看可以发现裁剪后的视频下方的黑条也被裁减掉了,当时他可能并没有发现这个问题,而我在跑的时候放的是没有黑条的视频,所以很明显察觉到视频高度少了,而显示的视频高度刚好是视频宽度/2得到的值,也就是说视频高宽设定是在哪里出了问题的。
在经过我的不断尝试之后发现,size这一行的代码依然是“宽高”而不是“高宽”,真正要写成“高宽”的是以下这一行:
target=frame[0:int(high),int(width/4):int(width/2+width/4)] #注意这里是高宽
其中冒号前数字表示起始像素,后面数字表示结束像素,我当前的代码表示截取视频的正中心
这样之后只裁剪了宽度,高度并没有差别,代码如下:
import cv2 as cv
cap=cv.VideoCapture("D:\CloudMusic\MV\毛不易 - 东北民谣.mp4")
#获取视频参数
width=cap.get(3)
high=cap.get(4)
fps=cap.get(5)
size=(int(width/2),int(high))
#定义编解码器并创建VideoWriter对象
fourcc=cv.VideoWriter_fourcc(*'XVID')
out=cv.VideoWriter('D:\CloudMusic\MV\毛不易 - 东北民谣_clip.avi',fourcc,fps,size)
while(cap.isOpened()):
ret,frame=cap.read()
target=frame[0:int(high),int(width/4):int(width/2+width/4)] #注意这里是高宽
out.write(target)
cv.imshow("frame_src",frame)
cv.imshow("frame",target)
k=cv.waitKey(1)
if(k==ord('q')): #退出播放并停止采集
break
print("视频裁剪完成")
print("原视频尺寸:"+str(int(width))+'*'+str(int(high)))
print("裁剪后尺寸:"+str(int(width/2))+'*'+str(int(high)))
cv.destroyAllWindows()
cap.release()
out.release()