在python中使用opencv2将使用mss的屏幕捕获部分保存为视频

2024-06-11 12:26:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把屏幕的一部分保存为视频。当运行下面的代码时,我可以看到窗口和fps计数(大约100-140 fps)。在

代码(需要安装的mssopencv2):

import numpy as np
import cv2
import time
import mss

frame_width = 1280
frame_height = 720
frame_rate = 20.0
PATH_TO_MIDDLE = "output.avi"
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(PATH_TO_MIDDLE, fourcc, frame_rate, 
                      (frame_width, frame_height))

with mss.mss() as sct:
    # Part of the screen to capture
    monitor = {"top": 120, "left": 280, "width": 1368, "height": 770}

    while "Screen capturing":
        last_time = time.time()

        # Get raw pixels from the screen, save it to a Numpy array
        img = np.array(sct.grab(monitor))
        img = cv2.resize(img, (1280, 720))
        frame = img

        cv2.putText(frame, "FPS: %f" % (1.0 / (time.time() - last_time)),
                    (10, 10),  cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        out.write(frame)
        cv2.imshow('frame', frame)

        # Press "q" to quit
        if cv2.waitKey(25) & 0xFF == ord("q"):
            break


# Clean up
out.release()
cv2.destroyAllWindows()

这段代码没有产生任何错误,所以我不明白这里出了什么问题。输出文件output.avi创建良好,但大小为5.7kb(这个文件我没有打开)。我尝试改变VideoWriter,在while内移动out和{},但没有成功。还试图更改frame_rate,并将framewidth和{}设置为更小的值。也看了this问题,但不能成功。在


Tags: to代码importimgratetimeoutwidth
1条回答
网友
1楼 · 发布于 2024-06-11 12:26:37

frame = img后面添加这两行有助于:

frame = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

可能opencv不能将图像另存为np.array,所以这里需要使用cv2.cvtColor。在

相关问题 更多 >