Python OpenCV imshow 预期垫参数
Python OpenCV imshow Expected mat Argument
我正在尝试编写一个程序来显示给定 window 上的特定位置。当我 运行 时,代码 OpenCV 给我一条错误消息,告诉我参数垫的意外类型。我不知道出了什么问题,因为当我在下面的代码中使用位置值时,它工作正常。请保持友善,因为我对 OpenCV 还很陌生。
代码:
#Imports
import numpy as np
import cv2
import pytesseract
from PIL import ImageGrab
import win32gui
#Assign Tesseract and other Variables
winList = []
toplist = []
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
lH = 33
lW = 20
#Window Handle Object
def enum_win(hwnd, result):
winText = win32gui.GetWindowText(hwnd)
winList.append((hwnd, winText))
win32gui.EnumWindows(enum_win, toplist)
typeHwnd = 0
#Find Window Handle
for (hwnd, winText) in winList:
if winText == "Program WinText Name Here":
typeHwnd = hwnd
if typeHwnd == 0:
print("Oops no Window Found")
while True:
position = win32gui.GetWindowRect(typeHwnd)
mid = (position[0] + (position[0] + position[2]))/2
sPos = [int(mid)-267, position[1] + 295, lW, lH]
screenshot = ImageGrab.grab(bbox=sPos)
screenshot = np.array(screenshot)
cv2.imshow("Screen", screenshot)
key = cv2.waitKey(25)
print(position)
print(mid)
错误信息:
Traceback (most recent call last):
File "C:/Users/MyName/PycharmProjects/Typing Bot/main.py", line 47, in <module>
cv2.imshow("Screen", screenshot)
TypeError: Expected Ptr<cv::UMat> for argument 'mat'
系统规格:
我 运行ning Windows 10 64 位和 Python 3 安装了所有导入模块的最新版本。
错误显示 imshow
中的 array
有问题,但你的问题从 grab
中的 sPos
开始。
grab
需要 bbox
这意味着 [x1, y1, x2, y2]
但是你使用 [x, y, width, height]
这会开始出现问题,因为 grab
returns 图像大小为 (0,0)
和 np.array()
不能转换它所以它 returns pillow image
而不是 numpy array
然后 imshow
得到 pillow image
而不是 numpy array
而且无法显示。
你必须使用[x, y, x+width, y+height]
最小工作示例 - 错误和正确 pos
import cv2
import numpy as np
import PIL.ImageGrab
x = 100
y = 100
w = 50
h = 50
pos = [x, y, w, h] # wrong
#pos = [x, y, x+w, y+h] # correct
print('bbox:', pos)
print('---')
img = PIL.ImageGrab.grab(pos)
print('img:', img)
print('type(img):', type(img))
print('img.size:', img.size)
print('---')
arr = np.array(img)
print('arr:', arr)
print('type(arr):', type(arr))
print('arr.size:', arr.size)
print('arr.shape:', arr.shape)
print('---')
cv2.imshow('test', arr)
print('Press ESC to exit')
while cv2.waitKey(100) != 27:
pass
我正在尝试编写一个程序来显示给定 window 上的特定位置。当我 运行 时,代码 OpenCV 给我一条错误消息,告诉我参数垫的意外类型。我不知道出了什么问题,因为当我在下面的代码中使用位置值时,它工作正常。请保持友善,因为我对 OpenCV 还很陌生。
代码:
#Imports
import numpy as np
import cv2
import pytesseract
from PIL import ImageGrab
import win32gui
#Assign Tesseract and other Variables
winList = []
toplist = []
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
lH = 33
lW = 20
#Window Handle Object
def enum_win(hwnd, result):
winText = win32gui.GetWindowText(hwnd)
winList.append((hwnd, winText))
win32gui.EnumWindows(enum_win, toplist)
typeHwnd = 0
#Find Window Handle
for (hwnd, winText) in winList:
if winText == "Program WinText Name Here":
typeHwnd = hwnd
if typeHwnd == 0:
print("Oops no Window Found")
while True:
position = win32gui.GetWindowRect(typeHwnd)
mid = (position[0] + (position[0] + position[2]))/2
sPos = [int(mid)-267, position[1] + 295, lW, lH]
screenshot = ImageGrab.grab(bbox=sPos)
screenshot = np.array(screenshot)
cv2.imshow("Screen", screenshot)
key = cv2.waitKey(25)
print(position)
print(mid)
错误信息:
Traceback (most recent call last):
File "C:/Users/MyName/PycharmProjects/Typing Bot/main.py", line 47, in <module>
cv2.imshow("Screen", screenshot)
TypeError: Expected Ptr<cv::UMat> for argument 'mat'
系统规格:
我 运行ning Windows 10 64 位和 Python 3 安装了所有导入模块的最新版本。
错误显示 imshow
中的 array
有问题,但你的问题从 grab
中的 sPos
开始。
grab
需要 bbox
这意味着 [x1, y1, x2, y2]
但是你使用 [x, y, width, height]
这会开始出现问题,因为 grab
returns 图像大小为 (0,0)
和 np.array()
不能转换它所以它 returns pillow image
而不是 numpy array
然后 imshow
得到 pillow image
而不是 numpy array
而且无法显示。
你必须使用[x, y, x+width, y+height]
最小工作示例 - 错误和正确 pos
import cv2
import numpy as np
import PIL.ImageGrab
x = 100
y = 100
w = 50
h = 50
pos = [x, y, w, h] # wrong
#pos = [x, y, x+w, y+h] # correct
print('bbox:', pos)
print('---')
img = PIL.ImageGrab.grab(pos)
print('img:', img)
print('type(img):', type(img))
print('img.size:', img.size)
print('---')
arr = np.array(img)
print('arr:', arr)
print('type(arr):', type(arr))
print('arr.size:', arr.size)
print('arr.shape:', arr.shape)
print('---')
cv2.imshow('test', arr)
print('Press ESC to exit')
while cv2.waitKey(100) != 27:
pass