注:此教程是对贾志刚老师的opencv课程学习的一个记录,在此表示对贾老师的感谢.
需求: 找出下图中的圆形.
如果直接用霍夫圆检测 的话,效果很差.
代码:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main() {Mat frame = imread("/home/fuhong/code/cpp/opencv_learning/src/small_case/imgs/case3.png", IMREAD_COLOR);imshow("frame", frame);Mat grayImg;cvtColor(frame, grayImg, COLOR_BGR2GRAY);imshow("grayimg", grayImg);vector<Vec3f> circles;
//      HoughCircles(grayImg,circles,HOUGH_GRADIENT,1,150,100,30,50,90);HoughCircles(grayImg, circles, HOUGH_GRADIENT, 1, 10, 100, 30, 5, 30);for (int i = 0; i < circles.size(); ++i) {Vec3f c = circles.at(i);Point center(c[0], c[1]);float radius = c[2];cout << radius << endl;circle(frame, center, radius, Scalar(0, 255, 0), 2, LINE_AA);}imshow("rest", frame);waitKey(0);destroyAllWindows();return 0;
}

效果如下图所示:

正确的操作: 二值分割 + 形态学处理 +横纵比计算
代码:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>using namespace cv;
using namespace std;Mat src, binary, dst;int main(int argc, char **argv) {src = imread("/home/fuhong/code/cpp/opencv_learning/src/small_case/imgs/case3.png", IMREAD_GRAYSCALE);if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE);imshow("input image", src);threshold(src, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);imshow("binary image", binary);Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(binary, dst, MORPH_CLOSE, kernel, Point(-1, -1));imshow("close image", dst);kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));morphologyEx(dst, dst, MORPH_OPEN, kernel, Point(-1, -1));imshow("open image", dst);vector<vector<Point>> contours;vector<Vec4i> hireachy;findContours(dst, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());Mat resultImage = Mat::zeros(src.size(), CV_8UC3);Point cc;for (size_t t = 0; t < contours.size(); t++) {double area = contourArea(contours[t]);if (area < 100) continue;Rect rect = boundingRect(contours[t]);float ratio = float(rect.width) / float(rect.height);if (ratio < 1.1 && ratio > 0.9) {drawContours(resultImage, contours, t, Scalar(0, 0, 255), -1, 8, Mat(), 0, Point());printf("circle area : %f\n", area);printf("circle length : %f\n", arcLength(contours[t], true));int x = rect.x + rect.width / 2;int y = rect.y + rect.height / 2;cc = Point(x, y);circle(resultImage, cc, 2, Scalar(0, 0, 255), 2, 8, 0);}}imshow("Result", resultImage);waitKey(0);return 0;
}

opencv之圆形检测相关推荐

  1. python 圆形检测_python下用OpenCV的圆形检测

    一.简介: 初次使用python的你一定感受到了python的便捷.作为高级编程语言只需调用类库即可. 对于圆形物体识别问题,opencv提供了大量方法. (代码文末附上) 二.检测步骤: 2.1读取 ...

  2. 【OpenCV 4开发详解】圆形检测

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. Python opencv进行圆形识别(圆检测)

    圆形识别(圆检测)是图像识别中很常见的一种处理方式,最核心的是cv2.HoughCircles这个函数实现的圆形检测.当然还有一些其他的处理过程,以下详述: 1 读入图像 首先需要读取一个图像文件,将 ...

  4. opencv角点检测学习总结

    学习opencv 角点检测 如果一个点在两个正交方向上都有明显的导数,则我们认为此点更倾向于是独一无二的,所以许多可跟踪的特征点都是角点. 一下为角点检测中用到的一些函数 cvGoodFeatures ...

  5. 利用opencv进行圆形标志提取和质心计算

    利用opencv进行圆形标志提取和质心计算 最近跟着老师做项目,需要对图片中拍摄的圆形标志点进行检测和提取,查了一些资料和博客,记录一下过程.实际拍摄的图片如图所示: 图片处理过程的大概思路是: 1. ...

  6. opencv 基础(6):基于OpenCV的轮廓检测

    利用轮廓检测,我们可以检测出目标的边界,并容易地定位.它通常是许多有趣应用,如图像前景提取,简单图像分割,检测和识别. 轮廓线在计算机视觉中的应用 一些非常酷的应用程序已经建立,使用轮廓进行运动检测或 ...

  7. 【opencv】 斑点检测 impleBlobDetector

    1. 什么是斑点 斑点通常是指与周围有着颜色和灰度差别的区域.在实际地图中,往往存在着大量这样的斑点,如一颗树是一个斑点,一块草地是一个斑点,一栋房子也可以是一个斑点.由于斑点代表的是一个区域,相比单 ...

  8. 使用Python,OpenCV和Scikit-Image检测低对比度图像

    使用Python,OpenCV和Scikit-Image检测低对比度图像 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何使用Python,OpenCV和Scikit-Image检测低对 ...

  9. python目标检测与识别_Python 使用Opencv实现目标检测与识别的示例代码

    在上章节讲述到图像特征检测与匹配 ,本章节是讲述目标检测与识别.后者是在前者的基础上进一步完善. 在本章中,我们使用HOG算法,HOG和SIFT.SURF同属一种类型的描述符.功能代码如下: impo ...

最新文章

  1. C++Primer学习笔记(二)
  2. mvc3 RenderAction传参问题
  3. 报名 | 第二届“大数据在清华”高峰论坛
  4. java hashmap 转对象_Java – 从HashMap中获取正确的转换对象
  5. 配置git 账户密码时bash:$:command not found
  6. OS10.11安装Cocoapods并集成ReactiveCocoa
  7. 《OSPF网络设计解决方案(第2版)》一第2章 介绍OSPF
  8. plsql日期转换错ORA-01830
  9. 第十二章 trie路由--基于Linux3.10
  10. 被欧美公司垄断的工业软件,中国还有机会吗?
  11. 楚留香服务器维护时间,【9月28日维护公告】
  12. win10系统如何设置局域网服务器,win10系统如何设置局域网共享
  13. 一副眼镜一千多贵吗_央视曝光!一副眼镜上千元,出厂价却只要几十元
  14. 文件打开模式r,w,a,r+,w+,a+的区别和联系
  15. 「星火计划沙龙视频」腾讯自研Kona JDK技术分享
  16. 使用Python创建excel文件成功后报错打不开
  17. 学计算机的鼓励,鼓励学习的经典语句
  18. 计算机网络--边缘和核心部分,三种数据交换方式
  19. 基于ISMS和信息安全等级保护两个标准的信息安全项目设计方法
  20. Flutter app打包详解

热门文章

  1. 戴尔服务器错误代码一览(非常详细)
  2. 经典面试题-元组和列表的区别
  3. Kubernetes 一指禅,文章集锦(实时更新)
  4. 基于OSPF(MGRE全连网状、星型结构)
  5. 图片随机出现的HTML代码,Javascript随机显示图片的源代码
  6. DevOps学习总结
  7. 【C】字符串库函数及重点函数的模拟实现(下)—— strstr | strtok | strerror
  8. 为什么快手消息显示服务器萌,快手萌面Kmoji上线 一键生成个人专属AR形象
  9. 区块链零知识证明:STARKs,Part-3:攻坚(下)
  10. 初次使用python(2)之如何下载ipdb模块