簡體   English   中英

如何在opencv-python中的單獨圖像中選擇ROI?

[英]How can I select ROI in a separate image in opencv-python?

我正在使用python 2.7.13和opencv 3.4.0。 我有一個有2個綠點的視頻流。 我正在使用顏色檢測來跟蹤它們。 我需要在兩個單獨的圖像中選擇兩個ROI(感興趣的區域),每個ROI包含一個點,以進行進一步處理。 我寫了一個程序來檢測它們並創建ROI,但是問題是它只選擇一個區域,而有兩個點。 此外,它給了我錯誤:“第47行,在cv2.imshow(”area1“,area1)NameError:名稱'area1'未定義”

但是如果我用img = cv2.imread(“image.jpg”)替換img = frame.array行,那么它可以工作,但只能用圖片。 這里程序如何運作

import cv2
import numpy as np
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import sys

lowerBound=np.array([33,80,40])
upperBound=np.array([102,255,255]) #ranges for green color

camera = PiCamera()
camera.rotation = 180
camera.resolution = (320, 240)
camera.framerate = 30
font=cv2.FONT_HERSHEY_SIMPLEX

rawCapture = PiRGBArray(camera, size=(320, 240))

time.sleep(0.1)
kernelOpen=np.ones((5,5))
kernelClose=np.ones((20,20))

for frame in camera.capture_continuous(rawCapture, format="bgr",         use_video_port=True): # capture frames from the camera
    img = frame.array #works only if I change this with img =cv2.imread("image.jpg")
    imgHSV= cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(imgHSV,lowerBound,upperBound)

    maskOpen=cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernelOpen)
    maskClose=cv2.morphologyEx(maskOpen,cv2.MORPH_CLOSE,kernelClose) #apply morphology for greater accuracy
    maskFinal=maskClose
    _, conts, _=cv2.findContours(maskFinal.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

    for i in range(len(conts)):
        x,y,w,h=cv2.boundingRect(conts[i])
        area1=img[y:y+h, x:x+w] #selecting my ROI
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255), 2)
    cv2.imshow("maskClose",maskClose)
    cv2.imshow("maskOpen",maskOpen)
    cv2.imshow("mask",mask)
    cv2.imshow("cam",img)
    cv2.imshow ("area1",area1) #Showing my ROI

    key = cv2.waitKey(1) & 0xFF
    rawCapture.truncate(0)
    if key == ord("q"):
            break

在for循環中,您可以設置/覆蓋area1 ,因此輸出將始終只是一個圖像。 您可以通過將imshow()移到for循環中來輕松解決此問題。

在代碼頂部添加:
prevNrOfContours = 0

使用以下代碼更改幀循環:

    # create a window for each roi
    nrOfContours = len(conts)
    for i in range(nrOfContours):
        x,y,w,h=cv2.boundingRect(conts[i])
        area=img[y:y+h, x:x+w] #selecting my ROI
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255), 2)
        cv2.imshow("area" + str(i), area)

    # if there are more open windows then roi's
    # then close the windows that will not be refreshed
    if prevNrOfContours > nrOfContours:
        for i in range(nrOfContours, prevNrOfContours):
            cv2.destroyWindow("area" + str(i))

    # store the number of roi's in this frame, so it can 
    # be used in the next frame
    prevNrOfContours = nrOfContours

編輯:擴展代碼,刪除不必要的打開的窗口

Edit2:僅選擇2個最大輪廓:

    # instantiate list
    contour_list = []

    for cnt in contours:
            # get contour size
            area = cv2.contourArea(cnt)
            # add tuple of the contour and its size to the list
            contour_list.append((cnt, area))

    # sort list on size
    sorted_list = sorted(contour_list, key=lambda x: x[1])
    # create a window for the 2 largest contours
    for i in range(-2,0):
            x,y,w,h=cv2.boundingRect(sorted_list[i][0])
            roi=img[y:y+h, x:x+w] #selecting my ROI
            cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255), 2)
            cv2.imshow("area" + str(i), roi)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM