2017-01-10 222 views
1

cv2.approxPolyDP()を使用して図形の完全な輪郭線を描くことができません。pythonでcv2.approxPolyDP()を使用して輪郭を描く

私は次のような結果になっています:

My result

をしかし、私はこのような出力たい:

This is what I'm looking for

はここに私のコードです:

import cv2 
im = cv2.imread('C:\Python27\Test\Targets\s1.jpg') # read picture 

imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # BGR to grayscale 

ret, thresh = cv2.threshold(imgray, 200, 255, cv2.THRESH_BINARY) 

countours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 

epsilon = 0.1 * cv2.arcLength(countours[0], True) 
approx = cv2.approxPolyDP(countours[0], epsilon, True) 

cv2.drawContours(im, approx, -1, (0, 255, 0), 3) 
cv2.imshow("Contour", im) 

cv2.waitKey(0) 
cv2.destroyAllWindows() 
+1

こんにちは、それはあなたが取得している、と何があなたが見たいつながる結果と何不明です。あなたは2つの画像を埋め込むことを忘れましたか? – Jann

+0

それをしました。今すぐ答えてください –

+0

私は同じコードを試しました。しかし、私は矩形の周りに輪郭を得ることができました –

答えて

2

cv2.CHAIN_APPROX_SIMPLEは、すべての冗長ポイントを削除し、輪郭を圧縮動作します。 cv2.CHAIN_APPROX_SIMPLEの代わりにfindContours()関数cv2.CHAIN_APPROX_NONEに渡すと、問題は解決されます。 あなたのコードは以下のように変更する必要があります。

_, countours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, 
               cv2.CHAIN_APPROX_NONE) 
0

私が試しました同じコードを出してください。しかし、私はこれを得ることができた:

enter image description here

+0

それは良いです。しかし、私はシャープでフラットなエッジを得る方法があります。私は形状の適切なコーナーを検出したいので、これらの粗いエッジを望んでいません。 –

+0

直線の場合、HoughLines()のようなものが必要になります。 –

0

Javaでは、これは、それによって、メモリを節約し、

MatOfPoint2f newContour = new MatOfPoint2f();  
largestContour.convertTo(newContour, CvType.CV_32F); 
double arcLength = Imgproc.arcLength(newContour, closed); 
double epsilon = 0.2 * arcLength; 
MatOfPoint2f approxCurve = new MatOfPoint2f(); 
Imgproc.approxPolyDP(newContour, approxCurve, epsilon, closed); 

// convert back to form that can be plotted by drawContours 
MatOfPoint largestOutline = new MatOfPoint(); 
approxCurve.convertTo(largestOutline, CvType.CV_32S); 
関連する問題