cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 不工作
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 的输出文件名
Screenshot of my screen
Screenshot from recorded video
所以,我环顾四周,发现显然这是 wards.then 版本 3.x 的 opencv 中的一个错误 我尝试使用 PIL 获取 rgb 图像并删除了 cvtColor(),但是它产生了一个空的 video.I 按照@ZdaR 的建议删除了 cvtColor() 和 PIL Image 它再次写了空视频因此我不得不把它放回去并繁荣。即使 cvtColor() 似乎什么都不做,但出于某种未知原因,它必须是 there.when 你将 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()
由于我是编程新手,如果我错过或忽略了一些重要的事情,我将非常感谢您的帮助
MSS 存储原始 BGRA 像素。如果您更改为:
,它是否有效?
# Grab it
img = np.array(sct.grab(mon))
# Convert from BGRA to RGB
frame = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
你可以做到
frameRGB = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
Frame
在 BGR
中,它的工作原理与您仅将 R
更改为 B
相同,其中 frameRGB
在 RGB
现在。此命令会将 R
传输到 B
,并可将帧从 RGB
和 BGR
以及 BGR
传输到 RGB
。 BGR2RGB
可能是一个错误,我也有,但我提到的命令完美无缺。我就是这么做的。
我正在尝试在 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
所以,我环顾四周,发现显然这是 wards.then 版本 3.x 的 opencv 中的一个错误 我尝试使用 PIL 获取 rgb 图像并删除了 cvtColor(),但是它产生了一个空的 video.I 按照@ZdaR 的建议删除了 cvtColor() 和 PIL Image 它再次写了空视频因此我不得不把它放回去并繁荣。即使 cvtColor() 似乎什么都不做,但出于某种未知原因,它必须是 there.when 你将 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()
由于我是编程新手,如果我错过或忽略了一些重要的事情,我将非常感谢您的帮助
MSS 存储原始 BGRA 像素。如果您更改为:
,它是否有效?# Grab it
img = np.array(sct.grab(mon))
# Convert from BGRA to RGB
frame = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
你可以做到
frameRGB = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
Frame
在 BGR
中,它的工作原理与您仅将 R
更改为 B
相同,其中 frameRGB
在 RGB
现在。此命令会将 R
传输到 B
,并可将帧从 RGB
和 BGR
以及 BGR
传输到 RGB
。 BGR2RGB
可能是一个错误,我也有,但我提到的命令完美无缺。我就是这么做的。