如何裁剪已调整大小的视频流?

How do I crop a video steam that's already been resized?

我正在使用 PIL ImageGrab 函数实时捕获应用程序 window 以使用 OpenCV 进行图像检测。我设法缩小捕获的 window 以提高图像检测速度。但是,我收到了一些我似乎无法避免的误报。我其实只需要截取一小段 window 761 34 1142 68

while True:
    # Grab PSS Window and find size 
    window = pygetwindow.getWindowsWithTitle('App')[0]
    x1 = window.left
    y1 = window.top
    height = window.height
    width = window.width
    x2 = x1 + width
    y2 = y1 + height
    # Actual Video Loop, cropped down to the specific window,
    # resized to 1/2 size, and converted to BGR for OpenCV
    haystack_img = ImageGrab.grab(bbox=(x1, y1, x2, y2))
    (width, height) = (haystack_img.width // 2, haystack_img.height // 2)
    haystack_img_resized = haystack_img.resize((width, height))
    
    ########### Line in Question ##############
    haystack_img_cropped = haystack_img_resized[761: 34, 1142:68]

    haystack_img_np = np.array(haystack_img_cropped) 
    haystack = cv.cvtColor(haystack_img_np, cv.COLOR_BGR2GRAY)
    cv.imshow("Screen", haystack)

我尝试使用 OpenCV 对图像进行切片,但出现错误:

C:\Users\coyle\OneDrive\froggy-pirate-master\avoidShips>C:/Users/coyle/AppData/Local/Programs/Python/Python39/python.exe c:/Users/coyle/OneDrive/froggy-pirate-master/avoidShips/avoidShipActual/test7.py
Traceback (most recent call last):
  File "c:\Users\test7.py", line 103, in <module>
    objectDetection(ships_to_avoid, 0.92)
  File "c:\Users\test7.py", line 61, in objectDetection
    haystack_img_cropped = haystack_img_resized[761:34, 1142:68]
TypeError: 'Image' object is not subscriptable

我尝试了 .crop 方法:

 haystack_img_resized = haystack_img.resize((width, height))
 haystack_img_resized.crop((761,34,1164,65))
 haystack_img_np = np.array(haystack_img_resized)

它没有产生任何错误,但实际上并没有裁剪任何东西。

如何裁剪我的视频流?

不知道为什么,但是将裁剪后的图像加载到变量中并使用该变量有效。

crop = haystack_img_resized.crop((761,34,1164,65))
haystack_img_np = np.array(crop)

haystack_img_cropped = np.array(haystack_img_resized)[761: 34, 1142:68] 应该可以。

对于您的问题,

  1. 切片前必须将PIL的Image转换为Numpy的array。
  2. .crop() returns 新修改的 PIL 图像实例,而不是修改现有的图像实例。 PIL 的方法通常 return 一个新的 Image 实例。