C++ OpenCV类圆形状检测及其面积

C++ OpenCV类圆形状检测及其面积,c++,opencv,geometry,hough-transform,C++,Opencv,Geometry,Hough Transform,我有一个圆形的图像,其中包含另一个类似的形状。我试图找到这两种形状的区域。我用OpenCV C++ Hough圆检测,但是它没有检测到形状。OpenCV中是否有其他功能可用于检测形状和查找战神 [编辑]已添加图像 这是我的示例代码 int main() { Mat src, gray; src = imread( "detect_circles_simple.jpg", 1 );resize(src,src,Size(640,480)); cvtColor( src, gray, C

我有一个圆形的图像,其中包含另一个类似的形状。我试图找到这两种形状的区域。我用OpenCV C++ Hough圆检测,但是它没有检测到形状。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;
}
intmain()
{
Mat src,灰色;
src=imread(“detect_circles_simple.jpg”,1);resize(src,src,Size(640480));
CVT颜色(src、灰色、CV_BGr2灰色);
//减少噪音,避免假圆检测
高斯模糊(灰色,灰色,大小(9,9),2,2);
矢量圆;
//应用Hough变换查找圆
霍夫圆(灰色、圆、CV_-HOUGH_梯度、1、30、200、50、0、0);

cout如果您有完整的形状(边缘完全或非常接近连接),则通常更容易进行边缘检测->轮廓->分析轮廓形状

当您只有一条线或一个圆的小片段时,Hough线或圆非常有用,但可能很难调整

编辑:尝试cv::adaptiveThreshold获取边,然后尝试cv::findContours

对于每个轮廓,将区域与周长进行比较,以确定其大小是否适合作为目标。然后执行cv::fitEllipse以检查其是否为圆并获得准确的中心。FindCOntours还有一个模式,可以告诉您哪些轮廓在其他轮廓的内部,因此您可以轻松地找到一个圆在另一个圆的内部


您可能会(根据照明情况)找到具有2个或更多轮廓的同一圆,即内边缘和外边缘。

我有类似的方法

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)


现在根据“代码>偏心率< /代码>变量给出的值,你可以得出你的轮廓是否是圆形的。阈值取决于你认为是圆形或近似圆的。< /P>是的,另外一千个。如果你希望得到一个具体的答案,就提供代码和图像。”M3H0W我添加了我正在工作的图像。on@viz12在图像处理敏感的东西中,你不应该真的使用手机摄像头来获取屏幕的图片-在这种情况下会出现很多瑕疵。只需发送原始图像或至少使用“打印屏幕”按钮拍摄屏幕截图。@Liberus抱歉,现在我上传了原始图像。我添加了图像,请您检查轮廓是否可以使用。我是第一次使用OpenCV,所以有些功能不确定。谢谢@Jeru,可以检测到内部的白色光盘吗?@viz12当然可以。您必须修改canny edge阈值values@viz12内圈看起来很轻。我建议先做一些自适应直方图均衡化谢谢!!我正在尝试使用

轮廓面积(轮廓[I])计算轮廓面积
。它是计算整个区域的面积还是只计算绿色区域的面积?非常感谢您的帮助!似乎我不需要找到内圈,只有外圈的面积就足够了。
#---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)