在将bgr转换为rgb时,获取TypeError:参数'src'的预期cv :: UMat

时间:2019-07-27 13:56:15

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

我想将bgr转换为rgb,但出现“ TypeError:参数'src'的预期cv :: UMat”错误

pip freeze:

greenlet==0.4.15
msgpack==0.6.1
mss==4.0.3
numpy==1.17.0
opencv-python==4.1.0.25
Pillow==6.1.0
pywin32==224

import numpy as np
import cv2
from mss import mss
from PIL import Image
from win32api import GetSystemMetrics

sct = mss()

(w, h) = (GetSystemMetrics(0) // 2, GetSystemMetrics(1) * 2 // 3)
(margin_l, margin_t) = (GetSystemMetrics(0) // 4, GetSystemMetrics(1)
                        // 3)

while True:
    monitor = {
        'top': margin_t,
        'left': margin_l,
        'width': w,
        'height': h,
    }
    img = Image.frombytes('RGB', (w, h), sct.grab(monitor).rgb)

    # img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    cv2.imshow('DEBUG', np.array(img))
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)不能更改“颜色空间”,但是如果没有此字符串,代码就可以正常工作,但是所有红色都是蓝色。

2 个答案:

答案 0 :(得分:0)

捕获下方颜色正确的屏幕的更好方法

# -*- coding: utf-8 -*-
import numpy as np
from PIL import ImageGrab
import cv2
from win32api import GetSystemMetrics

bbox = (GetSystemMetrics(0)//5, GetSystemMetrics(1)//3, GetSystemMetrics(0)//1.3, GetSystemMetrics(1))

while(True):
    printscreen = np.array(ImageGrab.grab(bbox=bbox))
    printscreen = cv2.cvtColor(printscreen, cv2.COLOR_BGR2RGB)
    cv2.imshow('window', printscreen)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break

答案 1 :(得分:0)

此代码对我有效,但需要进行以下调整:

  • monitor的定义移出了while之外。
  • 已将with上下文管理器用于MSS。
  • 删除了PIL的使用(它减慢了整个过程的速度)。
  • 删除了对img.rgb的访问权限(这减慢了整个过程的速度)。
monitor = {
    'top': margin_t,
    'left': margin_l,
    'width': w,
    'height': h,
}

with mss() as sct:
    while True:
        # Grab it
        img = np.array(sct.grab(monitor))

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

        # Display
        cv2.imshow('DEBUG', img)
        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break