OpenCV 和 python - 裁剪网络摄像头流并将其保存到文件

Posted

技术标签:

【中文标题】OpenCV 和 python - 裁剪网络摄像头流并将其保存到文件【英文标题】:OpenCV and python - crop webcam stream and save it to file 【发布时间】:2020-04-01 15:08:31 【问题描述】:

我想将我的网络摄像头录制的视频的特定区域保存到文件中。 我通过使用变量 x_0、x_1(宽度)和 y_0、y_1(高度)来定义要记录的区域的限制,裁剪记录的帧并将其保存到文件中。我还将这些维度提供给 cv2.VideoWriter。 这是我的代码:

import cv2


def main():
    # these are the limits of the cropped area
    x_0 = 100
    x_1 = 440
    y_0 = 0
    y_1 = 450

    cap = cv2.VideoCapture(2)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    # passing the dimensions of cropped area to VideoWriter
    out_video = cv2.VideoWriter('recording.avi', fourcc, 15.0, (y_1-y_0, x_1-x_0))

    while(cap.isOpened()):
        ret, frame = cap.read()

        if ret == True:
            frame_crop = frame[y_0:y_1, x_0:x_1]
            out_video.write(frame_crop)
            cv2.imshow("crop", frame_crop)
            key = cv2.waitKey(25)
            if key == ord('q'):
                break
        else:
            break

    cv2.destroyAllWindows()
    cap.release()


if __name__ == "__main__":
    main()

当我停止录制时,会生成文件,但它是空的。 问题在于我如何管理裁剪,因为如果我只是使用,说:

out_video = cv2.VideoWriter('recording.avi', fourcc, 15.0, (640, 480))

并保存整个帧(通过使用'out_video.write(frame_crop)')而不是裁剪的帧,它可以工作。 我做错了什么?

【问题讨论】:

(y_1-y_0, x_1-x_0) -- 宽度和高度的顺序错误。 感觉有点愚蠢,我在发布问题后注意到了。感到困惑,因为对于数组切片,你走相反的路。非常感谢! 【参考方案1】:

VideoWriter 中的视频大小参数的形状应为 (width, height)

你需要改变你对它的调用是这样的:

out_video = cv2.VideoWriter('recording.avi', fourcc, 15.0, (x_1-x_0, y_1-y_0))

【讨论】:

以上是关于OpenCV 和 python - 裁剪网络摄像头流并将其保存到文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 和 C 裁剪图像

OpenCV 从摄像头裁剪实时提要

使用 OpenCV 和 Python 显示网络摄像头源

opencv-python——2(颜色分割(RGBHSV)读取摄像头和视频并保存)

洞察使用 python 和 OpenCV 与 VideoCapture 进行多网络摄像头捕获

使用网络摄像头、OpenCV 和 Python 跟踪瞳孔位置