• OpenCV的石头检测~


    基于C++语言,实现使用OpenCV的霍夫圆检测算法HoughCircles实现石头检测和直径输出。

    效果图

    e69e5ebc2d287363cebf9ee30c929517.png

    代码实现:

    1. #include
    2. #include 
    3. #include 
    4. using namespace cv;
    5. using namespace std;
    6. #include
    7. std::string Convert(float Num)
    8. {
    9.  std::ostringstream oss;
    10.  oss << Num;
    11.  std::string str(oss.str());
    12.  return str;
    13. }
    14. //霍夫圆检测
    15. int main()
    16. {
    17.  //【1】载入原始图和Mat变量定义   
    18.  Mat srcImage = imread("D:\\Test\\test.jpg");
    19.  Mat midImage, dst, canny;//临时变量和目标图的定义
    20.  if (srcImage.empty()) {
    21.   printf("cloud not load inage...");
    22.   return -1;
    23.  }
    24.  //namedWindow("opencv", WINDOW_AUTOSIZE);
    25.   //【2】显示原始图
    26.  //imshow("【原始图】", image);
    27.  int lineType = 12;
    28.  //medianBlur(image, midImage, 3);//中值滤波
    29.  GaussianBlur(srcImage, midImage, Size(33), 22);
    30.  //【3】转为灰度图并进行图像平滑
    31.  cvtColor(midImage, midImage, CV_BGR2GRAY);//滤波的图为灰度图
    32.  //【4】进行霍夫圆检测
    33.  vector circles;
    34.  //cv.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
    35.  HoughCircles(midImage, circles, CV_HOUGH_GRADIENT, 13020201022);
    36.  srcImage.copyTo(dst);
    37.  //【5】依次在图中绘制出圆
    38.  for (size_t i = 0; i < circles.size(); i++)
    39.  {
    40.   Vec3f cc = circles[i];
    41.   circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(02550), 1, LINE_AA);//画圆
    42.   std::string data = Convert(cc[2]*2); //每个圆的直径信息
    43.   cout << "Please output the radius*2:" << data <//输出的是直径信息
    44.   Point p1 = Point(cc[0], cc[1]);
    45.   putText(dst, data, p1 , FONT_HERSHEY_PLAIN, 1, Scalar(00255), 0.3, LINE_AA); //在图上添加每个圆的直径信息
    46.   circle(dst, Point(cc[0], cc[1]), 2, Scalar(255,00), 2, LINE_AA);//圆心点
    47.   //参数定义
    48.  }
    49.  //【6】显示效果图  
    50.  //imshow("canny", dst);
    51.  imshow("【效果图】", dst);
    52.  waitKey(0);
    53.  return 0;
    54. }

    OpenCV霍夫圆检测原理

    在X-Y平面内,任意一圆可以用公式(1)所示:3f93e81ca221c959174146318cda6cdc.png其中(a,b)为圆心,r为圆半径,可将其视为二元函数f(x,y)= ,霍夫圆检测是将X-Y平面上的圆转换到a-b-r空间,a-b-r空间内的圆函数表示用公式(2)表示:14332a106faae02220af822da93459d1.png此时x,y为常数,可以将其视为三元函数f(a,b,r)=0,也就是说X-Y平面中圆上的一点便对应a-b-r空间内一条三维曲线,且X-Y平面的圆上所有点对应的a-b-r空间内的所有曲线都相交于一点(a_0,b_0,r_0),该点也就是对应X_Y平面空间上的圆的圆心和半径。这就是霍夫圆检测的原理,霍夫圆检测将图像中的每一个像素点都假设为圆上的点,再通过观察这些点的a-b-r空间内组成的三维曲线相交的情况,当相交数量大于一定的阈值时,就认为这些曲线对应的X-Y平面内的点构成一个圆。

    OpenCV的HoughCircles函数参数讲解

    参考往期教程:

    教你用OpenCV 和 Python实现圆物检测,点击跳转。

    最后运行代码,需要下载C++版本的编译过了的OpenCV安装包文件,并且在电脑中配置环境变量、Visual Studio中进行opencv的相关属性配置,不然不能使用OpenCV库函数。3c80ca21d30591da6356ab1a58c0186e.png

    314b84439cb9629eea8b01dac25741a4.png

    后台回复关键字:项目实战,可下载完整代码和OpenCV安装包。

    ··········  END  ··············

  • 相关阅读:
    【数据结构初阶(3)】双向带头结点循环链表
    python学习6
    【C++ 学习】库文件和头文件编写
    设备通过国标GB28181协议接入EasyCVR,报错“504 Gateway Time-out”是什么原因?
    [LeetCode]1413. 逐步求和得到正数的最小值
    基于高端全闪存存储在医院中的应用与探索
    JVS快速开发平台列表页配置
    uniapp配置了pages.json 的 tabbar 国际化,小程序切换语言没有实时切换
    【Linux】安全审计-audit
    神经内分泌肿瘤如何分级,神经系统分级调节概念
  • 原文地址:https://blog.csdn.net/weixin_45192980/article/details/126458132