2012-12-14 2 views
0

다음 코드를 사용하여 서클 만 검색합니다. 그러나 다른 모양도 감지하고 있습니다. 이 일을 도와주세요. 나는 HoughCircles를 사용했지만 좋은 결과를주지는 못합니다. 내 요구 사항은 서클 만 탐지해야합니다.OpenCV를 사용하는 서클 만 검색

Mat src, src_gray; 

/// Read the image 
src = t2; 

if(! src.data)        // Check for invalid input 
{ 
    cout << "Could not open or find the image" << std::endl ; 
    cv::waitKey(5000); 
} 

/// Convert it to gray 
cvtColor(src, src_gray, CV_BGR2GRAY); 
blur(src_gray, src_gray, Size(3,3)); 

/// Reduce the noise so we avoid false circle detection 
GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2); 


Mat src_lines; Mat src_gray_lines; 
int thresh_lines = 100; 
RNG rng_lines(12345); 

Mat threshold_output; 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 

src_gray_lines = src_gray; 
/// Detect edges using Threshold 
threshold(src_gray_lines, threshold_output, thresh_lines, 255, THRESH_BINARY); 
/// Find contours 
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

/// Find the rotated rectangles and ellipses for each contour 
vector<RotatedRect> minRect(contours.size()); 
vector<RotatedRect> minEllipse(contours.size()); 

for(size_t i = 0; i < contours.size(); i++) 
{ 
    minRect[i] = minAreaRect(Mat(contours[i])); 
} 

/// Draw contours + rotated rects + ellipses 
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3); 
for(size_t i = 0; i< contours.size(); i++) 
{ 
    // rotated rectangle 
    Point2f rect_points[4]; 
    minRect[i].points(rect_points); 
    for(int j = 0; j < 4; j++) 
     line(src, rect_points[j], rect_points[(j+1)%4], Scalar(255,0,0), 1, 8); 
} 

내 질문에 명확하지 않은 경우 알려 주시기 바랍니다.

답변

2

등고선 벡터가 있으므로 길이를 쉽게 확인할 수 있습니다. 서클에도 지역이 있습니다. 원 모양에는 특정 비율의 길이가 있어야합니다 (이 비율을 계산해야합니다). 이제이 비율 (일부 델타 포함)에 맞지 않는 도형을 제거하면 서클 만 표시됩니다.