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)
那行是什么意思?
从框架创建 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
这可以与您拥有的任何其他算法一起保存或传递给它。如果你有任何问题随时问。