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

Vip*_*per 5 python opencv image-processing

我正在创建一个能够识别手势的深度学习程序。我已经完成了模型的训练,现在我需要在实时视频中使用它。所以我试图创建一个 openCV 程序,用户将他/她的手放在框架中的感兴趣区域(一个盒子)中,并且 ROI 将输入到我的 CNN 模型中。根据手势,我的 CNN 模型会做出回复。

编写这段代码时,我设法创建了一个 300x300 的正方形(我的 ROI),但是如何使用该感兴趣区域将其输入到我的 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()
Run Code Online (Sandbox Code Playgroud)

** 额外

ROI = frame[100:200 , 100:200]
Run Code Online (Sandbox Code Playgroud)

那行是什么意思?

api*_*i55 4

从框架创建 ROI 实际上非常简单,基本上您已经在末尾编写了它 ( ROI = frame[100:200 , 100:200])。

让我们假设这是您执行上述代码后的投资回报率(图片来自互联网

在此输入图像描述

现在,如果您想要 ROI 内的内容作为另一张图像,您可以使用:

ROI = frame[100:400, 200:500] # according to the coordinates of your rectangle
Run Code Online (Sandbox Code Playgroud)

然而,这将导致矩形在图像中可见(见下图),因此您实际上需要从原始图像创建一个副本。

这是在没有复制原始内容的情况下的样子:

在此输入图像描述

另外,一些算法在这个 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()
Run Code Online (Sandbox Code Playgroud)

请注意,我添加了对 cam 打开和 ret 的检查。它会告诉您打开网络摄像头是否有任何问题或图像是否无法读取。

这将是 ROI 中生成的图像:

在此输入图像描述

cv2.imwrite这可以与您拥有的任何其他算法一起保存或传递给它。如果你有任何问题随时问。