cv2.cvtColor(img,cv2.COLOR_BGR2RGB) not working



我正在尝试使用python中的mss和Opencv创建屏幕录像机,我捕获的视频与原始计算机屏幕的颜色非常不同。我试图在网上找到解决方案,每个人都说它应该使用 cvtColor(( 修复,但我的代码中已经有了它。

import cv2
from PIL import Image
import numpy as np
from mss import mss
import threading
from datetime import datetime

'

def thread_recording():
fourcc=cv2.VideoWriter_fourcc(*'mp4v')
#fourcc=cv2.VideoWriter_fourcc(*'XVID')
out=cv2.VideoWriter(vid_file,fourcc,50,(width,height))
mon = {"top": 0, "left": 0, "width":width, "height":height}
sct = mss()
thread1=threading.Thread(target=record,args=(mon,out,sct))
thread1.start()
def record(mon,out,sct):
global recording
recording=True
while recording:
frame= np.array(sct.grab(mon))
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
out.write(frame)
out.release()

vid_file变量包含一串扩展名为 MP4 的输出文件名

我的屏幕截图

录制视频的屏幕截图

所以,我环顾四周,发现显然这是 opencv 中 3.x 版的一个错误,然后我尝试 PIL 获取 rgb 图像并删除了 cvtColor((,但它产生了一个空视频。我按照@ZdaR的建议删除了cvtColor((和PIL图像,它再次写入了空视频,因此我不得不将其放回原处并蓬勃发展。即使 cvtColor(( 看起来什么都不做,出于某种未知的原因,它也必须在那里。当您将 PIL Image 与 cvtColor(( 一起使用时,它会按预期写入视频

from PIL import Image
def record(mon,out,sct):
global recording
recording=True
while recording:
frame=sct.grab(mon)
frame = Image.frombytes('RGB', frame.size, frame.rgb)
frame = cv2.cvtColor(np.array(frame), cv2.COLOR_BGR2RGB)
out.write(np.array(frame))
out.release()

由于我对编程很陌生,如果我错过或忽略了一些重要的事情,我将非常感谢您的帮助

你可以做

frameRGB = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)

FrameBGR,它的工作方式与您仅更改R相同,BframeRGB现在处于RGB的位置。此命令将R传输到B,并用于将帧从RGBBGR以及BGR传输到RGBBGR2RGB可能是一个错误,我也有它,但我提到的命令运行良好。这就是我所做的。

MSS 存储原始 BGRA 像素。如果您更改为:

# Grab it
img = np.array(sct.grab(mon))
# Convert from BGRA to RGB
frame = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)

你应该在cmd中运行这个命令

pip install opencv-python  

最新更新