opencv 颜色(img,cv2.COLOR_BGR2RGB)不工作

hzbexzde  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(238)

我尝试使用mss和Opencv在python中创建一个屏幕记录器,我捕获的视频与原始电脑屏幕的颜色有很大不同。我试图在网上找到解决方案,每个人都说应该使用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扩展名的输出文件名字符串
Screenshot of my screen
Screenshot from recorded video

g6ll5ycj

g6ll5ycj1#

所以,我又看了看周围,发现这显然是病房上3.x版本的opencv中的一个bug。然后我尝试了PIL来获取rgb图像,并删除了cvtColor(),但它生成了一个空视频。我删除了两个cvtColor()以及PIL图像的建议,由@ZdaR它再次写空视频,因此我不得不把它放回和繁荣。即使cvtColor()似乎什么都不做,由于一些未知的原因,它必须在那里。当您将PIL图像与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()

由于我是编程新手,如果我错过或忽略了一些重要的东西,我将非常感谢您的帮助

z9zf31ra

z9zf31ra2#

你可以做

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

FrameBGR中,它的工作原理与您仅将R更改为B相同,其中frameRGB现在位于RGB中。此命令将R传输到B,并将帧从RGBBGR传输到BGR传输到RGBBGR2RGB可能是一个bug,我也有这个bug,但是我提到的命令可以完美地工作。这就是我所做的。

v7pvogib

v7pvogib3#

MSS存储原始BGRA像素。如果更改为以下内容,它是否工作:

# Grab it
img = np.array(sct.grab(mon))

# Convert from BGRA to RGB
frame = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
p5fdfcr1

p5fdfcr14#

您应该在cmd中运行此命令

pip install opencv-python

相关问题