【问题标题】:cv2.cvtColor(img,cv2.COLOR_BGR2RGB) not workingcv2.cvtColor(img,cv2.COLOR_BGR2RGB) 不工作
【发布时间】:2022-05-02 04:38:25
【问题描述】:

我正在尝试在 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 扩展名的输出文件名

Screenshot of my screen

Screenshot from recorded video

【问题讨论】:

  • 你为什么要删除你所有的import 声明——现在我不知道sct.grab() 来自哪里,所以我帮不了你。
  • 当您注释掉以下行时会发生什么:frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)?输出还是一样吗?好吧,它不应该是。
  • 我再次添加了导入语句@Mark
  • 我尝试在它之后评论frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),VideoWriter不会在视频@ZdaR中写任何东西

标签: python-3.x opencv python-mss


【解决方案1】:

所以,我环顾四周,发现这显然是 wards 上 3.x 版本的 opencv 中的一个错误。然后我尝试 PIL 获取 rgb 图像并删除 cvtColor(),但它产生了一个空视频。我根据@ZdaR 的建议删除了 cvtColor() 和 PIL Image 它再次写了空视频因此我不得不把它放回去并繁荣。即使 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()

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

【讨论】:

    【解决方案2】:

    你可以的

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

    FrameBGR 中,它的工作方式与您将R 更改为B 相同,其中frameRGB 现在在RGB 中。该命令会将R 传输到B,并用于将帧从RGBBGR 以及BGR 传输到RGBBGR2RGB 可能是一个错误,我也有,但我提到的命令完美运行。我就是这么做的。

    【讨论】:

      【解决方案3】:

      MSS 存储原始 BGRA 像素。如果您更改为:它是否有效:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-21
        • 2017-06-16
        • 2014-07-22
        • 2019-08-25
        • 2017-01-15
        • 2017-07-29
        • 2020-06-25
        • 1970-01-01
        相关资源
        最近更新 更多