2017-02-02 15 views
3

イメージの特定の領域で輪郭線を見つけようとしています。画像の残りの部分に輪郭を表示するのではなく、ROI内に輪郭を表示することは可能ですか?私はマスクを使うべきであるという別の同様の記事を読みましたが、私はそれを正しく使ったとは思いません。 OpenCVとPythonには新しいものがありますので、どんな助けでも大いに役立ちます。opencvとPythonを使用してROI内の輪郭を見つける方法はありますか?

import numpy as np 
import cv2 

cap = cv2.VideoCapture('size4.avi') 
x, y, w, h= 150, 50, 400 ,350 
roi = (x, y, w, h) 

while(True): 
    ret, frame = cap.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    _, thresh = cv2.threshold(gray, 127, 255, 0) 
    im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

    roi = cv2.rectangle(frame, (x,y), (x+w, y+h), (0,0,255), 2) 
    mask = np.zeros(roi.shape,np.uint8) 
    cv2.drawContours(mask, contours, -1, (0,255,0), 3) 

    cv2.imshow('img', frame) 

答えて

5

あなたがあると主張するので、初心者、私は解説と一緒に解決策を見つけました。

以下は、オリジナルの画像であることを考えてみましょう:

enter image description here

は赤で、次の領域は、あなたの輪郭を見つけたい興味(ROI)のお住まいの地域、であると仮定します。

enter image description here

まず、同じサイズの黒いピクセルの画像を構築します。 それは同じサイズのものでなければならない:マスクを形成し、ROIを強調するために今すぐ

black = np.zeros((img.shape[0], img.shape[1], 3), np.uint8) #---black in RGB 

enter image description here

black1 = cv2.rectangle(black,(185,13),(407,224),(255, 255, 255), -1) #---the dimension of the ROI 
gray = cv2.cvtColor(black,cv2.COLOR_BGR2GRAY)    #---converting to gray 
ret,b_mask = cv2.threshold(gray,127,255, 0)     #---converting to binary image 

enter image description here

は今、あなたのして上に画像をマスク元画像:

fin = cv2.bitwise_and(th,th,mask = mask) 

enter image description here

次に上記画像における輪郭を見つけるためcv2.findContours()を使用します。

次に、cv2.drawContours()を使用して元の画像に輪郭を描きます。あなたは最終的には、以下を取得します:

enter image description here

専用ののために使用されているOpenCVの中ビット単位のAND操作空くのあなたが認識して取得するように存在だけでなく、より良い方法かもしれませんが、これが行われましたマスキング

+0

うわー、ありがとう!それは本当に有益でした。 – agrom

+2

イメージでマスキングを実行する方法を知りたいので、私はこのソリューションを提供しました。キーは関数 'cv2.bitwise_and()'を効率的に使用することです。 –

+0

はい、それはマスクする方法を理解する素晴らしい方法でした;)小さなフォローアップの質問:私が輪郭を描くときに、 ROIのフレームと内部の輪郭は、起こるはずですか?私はあなたがあなたの例でそれを持っていないのを見ます。 – agrom

4

PythonでROIを設定するには、標準NumPyインデックスsuch as in this exampleを使用します。

ので、右のROIを選択するために、あなたは(つまり、四角形を描画するためである)cv2.rectangle機能を使用しませんが、代わりに次の操作を行います。

_, thresh = cv2.threshold(gray, 127, 255, 0) 
roi = thresh[x:(x+w), y:(y+h)] 
im2, contours, hierarchy = cv2.findContours(roi, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
+2

矩形のオフセットを 'findContours'に渡すことで、検索された輪郭点が元の画像を参照するようにすることができます – Miki

+0

ありがとう、私はroiを書いた方法を変更しました。あなたはMikiを提案するようにどのように四角形をオフセットしますか? – agrom

+2

ドキュメント:http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours関数の最後の引数は、オフセットを指定するタプルです。すなわち: 'im2、contours、hierarchy = cv2。findContours(roi、cv2.RETR_TREE、cv2.CHAIN_APPROX_SIMPLE、(x、y)) ' –

関連する問題