Python Opencv 简单视频裁剪功能的实现

本篇文章基于

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()

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