我使用以下代码仅检测圆圈。但它也检测其他形状。请帮忙做到这一点。我使用过HoughCircles,但它没有给出好结果。我的要求是只能检测圆圈。
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 );
}
如果我的问题不明确,请告诉我。
答案 0 :(得分:2)
您有轮廓矢量,因此您可以轻松检查它们的长度。圈子也有区域。 圆形形状应具有特定的面积与长度比(您应该计算该比率应该是多少)。现在消除不适合这个比例的形状(有一些三角形),你只得到圆圈。