繁体   English   中英

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

[英]How to save the region of interest of a frame using openCV?

我正在创建一个能够识别手势的深度学习程序。 我已经完成了模型的训练,现在我需要在实时视频中使用它。 所以我正在尝试创建一个 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()

** 附加

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

那条线是什么意思?

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

让我们假设这是您在执行上述代码后获得 ROI 的手(图片来自互联网):

在此处输入图片说明

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

ROI = frame[100:400, 200:500] # according to the coordinates of your rectangle

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

这是没有从原件复制的样子:

在此处输入图片说明

此外,一些算法在这个 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()

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

这将是 ROI 中的结果图像:

在此处输入图片说明

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

导入 cv2 导入 numpy 作为 np

cam = cv2.VideoCapture(0)

如果不是 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()

执行需要多少次?...执行需要很长时间...

它还给出了“无法打开凸轮?...我该如何解决这个问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM