如何使用OpenCV保存帧的感兴趣区域?

5

我正在创建一个深度学习程序,可以识别手势数字。我已经完成了对模型的训练,现在需要在实时视频中使用它。 因此,我正在尝试创建一个openCV程序,其中用户将把他/她的手放在帧的区域 of interest(即一个框)内,然后该ROI将被传送到我的CNN模型中。根据手势,我的CNN模型将进行回复。

我编写了这段代码,在其中,我成功创建了一个300x300的正方形(我的ROI),但是如何使用该区域 of interest将其提供给我的CNN模型呢? 我只想将那个正方形部分作为输入送入我的模型。

import traceback
import cv2
import numpy as np
import math

cam = cv2.VideoCapture(0)

while(1):
    try:
        ret, frame = cam.read()
        frame = cv2.flip(frame,1)
        cv2.rectangle(frame,(200,100),(500,400),(0,255,0),2) 
        cv2.imshow('curFrame',frame)


        if cv2.waitKey(1) & 0xFF == ord('q'):
            break



    except Exception:
        traceback.print_exc()
        pass        

cam.release()
cv2.destroyAllWindows()

** 附加内容

ROI = frame[100:200 , 100:200]

那行代码是什么意思?


永远不要在通用的except子句中使用pass。使用Python中的OpenCV图像存储为numpy数组。请参阅numpy文档以了解如何从数组中获取区域的索引:https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html - alkasm
1
frame[100:200 , 100:200] means that you want apart in frame which goes from (100,100) to (200,200). And is y,x, like frame[y1:y2, x1:x2] - api55
1个回答

4

从一帧中创建ROI实际上非常简单,基本上你已经在末尾写好了(ROI = frame[100:200 , 100:200])。

假设这是你的手,你在上面执行了上述代码并得到了ROI(图片来源于internet):

enter image description here

现在,如果你想要将ROI内的内容作为另一幅图像获取,你可以使用以下代码:
ROI = frame[100:400, 200:500] # according to the coordinates of your rectangle

然而这样会导致矩形在图像中也可见(参见下图),因此您需要从原始图像创建副本。
以下是未从原始图像复制的效果:

enter image description here

此外,使用numpy的切片视图时,一些算法表现得有些奇怪,因此最好进行复制。最终代码应如下所示:
import cv2
import numpy as np

cam = cv2.VideoCapture(0)

if not cam.isOpened():
  print ("Could not open cam")
  exit()

while(1):
    ret, frame = cam.read()
    if ret:
        frame = cv2.flip(frame,1)
        display = cv2.rectangle(frame.copy(),(200,100),(500,400),(0,255,0),2) 
        cv2.imshow('curFrame',display)
        ROI = frame[100:400, 200:500].copy()
        cv2.imshow('Current Roi', ROI)

    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cam.release()
cv2.destroyAllWindows()

注意我添加了检查摄像头是否打开和ret的代码。ret会告诉你是否存在打开摄像头或读取图像的问题。
这将是ROI中的结果图像:

enter image description here

这可以使用cv2.imwrite保存,或传递给您拥有的任何其他算法。如果您有任何问题,请随时提问。

https://stackoverflow.com/questions/57770939/how-to-input-a-frame-data-to-my-cnn-model?noredirect=1#comment101977021_57770939 - Viper
如果您想保存图像文件,请使用cv2.imwrite,如果要读取图像文件,请使用cv2.imread - api55

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接