2017-03-20 17 views
1

enter image description here私は同じような形をした1つの円のような形の画像を持っています。私はその2つの形の領域を見つけようとしています。私はopenCv C++ Houghサークル検出を使用していますが、形状を検出しません。 OpenCVの他の機能は、形状を検出し、アレスを見つけるために使用できますか?OpenCVのような形の検出とその領域

[編集]画像が追加されました。あなたは(完全に、または非常に近い加入エッジ)、一般的にエッジに簡単です完全な形状を持っている場合は

はここに私のサンプルコード

int main() 
{ 
    Mat src, gray; 
    src = imread("detect_circles_simple.jpg", 1);resize(src,src,Size(640,480)); 
    cvtColor(src, gray, CV_BGR2GRAY); 
    // Reduce the noise so we avoid false circle detection 
    GaussianBlur(gray, gray, Size(9, 9), 2, 2); 

    vector<Vec3f> circles; 

    // Apply the Hough Transform to find the circles 
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 30, 200, 50, 0, 0); 
    cout << "No. of circles : " << circles.size()<<endl; 
    // Draw the circles detected 
    for(size_t i = 0; i < circles.size(); i++) 
    { 
     Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
     int radius = cvRound(circles[i][2]); 
     circle(src, center, 3, Scalar(0,255,0), -1, 8, 0);// circle center  
     circle(src, center, radius, Scalar(0,0,255), 3, 8, 0);// circle outline 
     cout << "center : " << center << "\nradius : " << radius << endl; 
    } 
    exit(0); 
    // Show your results 
    namedWindow("Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE); 
    imshow("Hough Circle Transform Demo", src); 

    waitKey(0); 
    return 0; 
} 
+3

はい、1000人です。特定の回答が必要な場合は、コードと画像を提供してください。 – m3h0w

+0

@ m3h0w私は – viz12

+0

@ viz12で作業している画像を追加しました。この場合、画像処理に敏感なものでは画面の画像を得るために電話機のカメラを実際に使用すべきではありません。元の画像を送信するか、少なくとも「スクリーン印刷」ボタンを使用してスクリーンショットを撮るだけです。 – Liberus

答えて

1

で検出 - >輪郭 - >輪郭形状を解析します。

ハフ線や円はあなただけのラインや円の小さな断片を持っているときに、非常に有用であるが、

編集調整するトリッキーなことができます:エッジを得るためにCV :: adaptiveThresholdを試してみて、その後のcv :: findContours 。

輪郭ごとに、領域を周囲と比較して、ターゲットに適したサイズかどうかを確認します。次に、cv :: fitEllipseを実行して円であるかどうかをチェックし、正確な中心を取得します。 FindCOntoursには、どの輪郭が他の輪郭の内側にあるかを示すモードもあります。したがって、別の輪の中に円を簡単に見つけることができます。

2つ以上の等高線を持つ同じ円を見つけることができます(照明によって異なります)。内側と外側のエッジのために。

+0

画像を追加しました。輪郭が使用できるかどうか確認してください。私は、最初の時間のOpenCVを使用しているので、いくつかの機能については不明です。 – viz12

3

私は同様のアプローチをとっています。

img1 = cv2.imread('disc1.jpg', 1) 
img2 = img1.copy() 
img = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) 

#--- Blur the gray scale image 
img = cv2.GaussianBlur(img,(5, 5),0) 

#--- Perform Canny edge detection (in my case lower = 84 and upper = 255, because I resized the image, may vary in your case) 
edges = cv2.Canny(img, lower, upper) 
cv2.imshow('Edges', edges) 

enter image description here

#---Find and draw all existing contours 
_, contours , _= cv2.findContours(edged, cv2.RETR_TREE, 1) 
rep = cv2.drawContours(img1, contours, -1, (0,255,0), 3) 
cv2.imshow(Contours',rep) 

enter image description here

あなたは円形のエッジの形状を分析しているので、あなたの輪郭の偏心を決定することは、この場合に役立ちます。今、あなたはあなたの輪郭が円形であるかどうか結論を出すことができeccentricity変数で指定した値に基づいて

#---Determine eccentricity 
cnt = contours 
for i in range(0, len(cnt)): 
    ellipse = cv2.fitEllipse(cnt[i]) 
    (center,axes,orientation) =ellipse 
    majoraxis_length = max(axes) 
    minoraxis_length = min(axes) 
    eccentricity=(np.sqrt(1-(minoraxis_length/majoraxis_length)**2)) 
    cv2.ellipse(img2,ellipse,(0,0,255),2) 

cv2.imshow('Detected ellipse', img2) 

enter image description here

。しきい値は、円形または近似円であると考えられるものによって決まります。

+0

ありがとう@Jeru、内側の白いディスクを検出することは可能でしょうか? – viz12

+0

@ viz12もちろん可能です。あなたはキャニーエッジのしきい値を変更する必要があります –

+0

@ viz12内側の円は明るく見えます。私はいくつかの適応ヒストグラム等化を最初に行うことを提案します –

関連する問題