cv2.cvtColor (img, cv2.COLOR_BGR2RGB) не работает - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь создать экранный рекордер, используя 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

Снимок экрана моего экрана

Снимок экрана с записанным видео

Ответы [ 2 ]

0 голосов
/ 06 января 2020

MSS хранит необработанные пиксели BGRA. Это работает, если вы измените на:

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

# Convert from BGRA to RGB
frame = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
0 голосов
/ 06 января 2020

Итак, я огляделся еще немного и обнаружил, что, по-видимому, это ошибка в opencv для версий 3.x на wards. Затем я попробовал PIL для получения изображения rgb и удалил cvtColor (), но он выдал пустое видео. удалил как cvtColor (), так и PIL Image, как предложено @ZdaR, он снова записал пустое видео. даже если кажется, что 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()

, поскольку я очень новичок в программировании, я был бы очень признателен за вашу помощь, если бы я пропустил или упустил что-то важное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...