2017-03-20 5 views
1

enter image description here 비슷한 모양을 가진 모양과 같은 원이있는 이미지가 있습니다. 나는이 두 가지 형태의 영역을 찾으려고 노력하고있다. openCv C++ Hough circle 감지를 사용하고 있지만 모양을 감지하지 못합니다. 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

예, 천 명이 넘습니다. 특정 답변이 필요한 경우 코드와 이미지를 제공하십시오. – m3h0w

+0

@ m3h0w 내가 작업중인 이미지를 – viz12

+0

@ viz12에 추가했습니다. 민감한 사진을 처리 할 때 화면의 사진을 찍기 위해 휴대 전화 카메라를 사용해서는 안됩니다.이 경우 많은 유물이 있습니다. 원본 이미지를 보내거나 최소한 "스크린 인쇄"버튼을 사용하여 스크린 샷을 찍으십시오. – Liberus

답변

1

입니다 감지 -> 윤곽 -> 윤곽의 모양을 분석.

허프 선이나 원은 만 선이나 원의 작은 조각이있을 때 매우 유용하지만,

편집 조정하는 까다로운 일이 될 수 있습니다 : 가장자리를 얻기 위해 이력서 :: adaptiveThreshold을 시도하고 이력서 :: findContours .

각 윤곽선에 대해 경계선을 면적과 비교하여 대상으로 적합한 크기인지 확인하십시오. 그런 다음 cv :: fitEllipse를 실행하여 원인지 여부를 확인하고 정확한 중심을 얻습니다. FindCOntours에는 어떤 윤곽이 다른 윤곽인지 알려주는 모드가 있으므로 다른 윤곽을 쉽게 찾을 수 있습니다.

조명에 따라 2 개 이상의 등고선이있는 동일한 원을 찾을 수 있습니다 (예 : 조명에 따라 다름). 안쪽과 바깥 쪽 가장자리.

+0

이미지를 추가했습니다. 컨투어를 사용할 수 있는지 확인하십시오. 나는 주먹 시간의 OpenCV를 사용하고 있습니다. 그래서 몇 가지 기능에 대해서는 확실하지 않습니다. – viz12

3

나는 비슷한 접근법을 가지고있다. 당신의 윤곽의 편심을 결정

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

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) 
,이 경우에 도움이 될 것입니다.
#---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

은 이제 윤곽이 원형 또는 여부 당신이 결론에 도달 할 수있는 eccentricity 변수에 의해 주어진 값을 기반으로. 임계 값은 원형 또는 대략적인 원으로 간주됩니다.

+0

감사합니다. @Jeru, 내부 화이트 디스크를 감지 할 수 있습니까? – viz12

+0

@ viz12 물론 가능합니다. 가장 좋은 가장자리 임계 값을 수정해야합니다. –

+0

@ viz12 내부 원이 가벼운 것처럼 보입니다. 먼저 적응 형 히스토그램 등화를 제안합니다. –