簡體   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