2017-09-01 5 views
0

囲み円は単純な塗りつぶしの形にしたいと思います。私はopencvとpythonを使っています。私はminEnclosingCircle関数を使用します。しかし、私は奇妙な結果を得るいくつかの例には:OpenCV(Python)を使用したminEnclosingCircleの奇妙なセンター

enter image description here

センターの形状を中心としたことになっている、と円が形に触れることになっています。これは明らかにそうではありません。

興味深いのは、中心が90度回転した同じ写真ではないことです。シフトが少なくなります。ローテーションが最小包囲円の中心を変更する理由はありません。これは、この関数が盗聴されていることを意味し、代替が必要です。私はただ円の中心が必要です。ここで

enter image description here

私のコードの小型版である:

import cv2 
import numpy as np 

img = cv2.imread('testodd3.jpg',cv2.CV_LOAD_IMAGE_COLOR) 
pic = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
ret,thresh = cv2.threshold(pic,127,255,0) 
thresh = cv2.bitwise_not(thresh) 
contours,hierarchy = cv2.findContours(thresh, 1, 2) 

cnt = contours[0] 
(x,y),radius = cv2.minEnclosingCircle(cnt) 
center = (int(x),int(y)) 
radius = int(radius) 
cv2.circle(img,center,radius,(0,255,0),3) 
cv2.circle(img,center,3,(255,255,0),3) 
cv2.drawContours(img, [cnt], 0, (0,0,255), 3) 

cv2.imshow('image',img) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

私は同様の問題を見ましたが、解決策は、C++ライブラリを使用しています:Unexpected results of minEnclosingCircle in OpenCV

+1

はバグが提出されたようだ、プルリクエストはそれを修正しようとしましたが、それはテストを破ったので、その後のプルはキャンセルされました。多分再開する必要があります。 [GitHub](https://github.com/opencv/opencv/pull/2758)のディスカッションを参照してください。 –

+0

私にこれを指摘してくれてありがとう。バグレポートには私が気づいた大きな円が書かれていますが、幸いにも私は中心にしか興味がないので私にとっては問題ではありません。しかし私の場合、センターは間違っています。ディスカッションにメッセージを追加し、何が起こるかを見ていきます。 – Tom

+0

@Tom私の答えがあなたの質問に十分かどうかを確認してください –

答えて

0

私が使用OpenCVのバージョンをされます2.4.13.2_2(この日付のMacでの最新の自作バージョン)。実装が壊れているようです:https://github.com/opencv/opencv/issues/6438

Opencv 3.3はうまく動作する別の実装を使用しています。ここで

Vertical image with correct center Horizontal image with correct center

簡単なコードです:

import cv2 
import numpy as np 

img = cv2.imread('testodd7.jpg',cv2.IMREAD_GRAYSCALE) 
ret,thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY) 
img,contours,hierarchy = cv2.findContours(thresh, 1, 2) 

cnt = contours[0] 
(x,y),radius = cv2.minEnclosingCircle(cnt) 
center = (int(x),int(y)) 
radius = int(radius) 

img2 = cv2.imread('testodd7.jpg',cv2.IMREAD_COLOR) 
cv2.circle(img2,center,radius,(0,255,0),3) 
cv2.circle(img2,center,3,(255,255,0),3) 
cv2.drawContours(img2, [cnt], 0, (0,0,255), 3) 

cv2.imshow('image',img2) 
cv2.waitKey(0) 
cv2.destroyAllWindows()