原理

霍夫圆变换

  • 霍夫圆变换的基本原理和上个教程中提到的霍夫线变换类似, 只是点对应的二维极径极角空间被三维的圆心点x, y还有半径r空间取代.

  • 对直线来说, 一条直线能由参数极径极角  表示. 而对圆来说, 我们需要三个参数来表示一个圆, 如上文所说现在原图像的边缘图像的任意点对应的经过这个点的所有可能圆是在三维空间有下面这三个参数来表示了,其对应一条三维空间的曲线. 那么与二维的霍夫线变换同样的道理, 对于多个边缘点越多这些点对应的三维空间曲线交于一点那么他们经过的共同圆上的点就越多,类似的我们也就可以用同样的阈值的方法来判断一个圆是否被检测到, 这就是标准霍夫圆变换的原理, 但也正是在三维空间的计算量大大增加的原因, 标准霍夫圆变化很难被应用到实际中:

    这里的  表示圆心的位置 (下图中的绿点) 而  表示半径, 这样我们就能唯一的定义一个圆了, 见下图:

  • 出于上面提到的对运算效率的考虑, OpenCV实现的是一个比标准霍夫圆变换更为灵活的检测方法: 霍夫梯度法, 也叫2-1霍夫变换(21HT), 它的原理依据是圆心一定是在圆上的每个点的模向量上, 这些圆上点模向量的交点就是圆心, 霍夫梯度法的第一步就是找到这些圆心, 这样三维的累加平面就又转化为二维累加平面. 第二部根据所有候选中心的边缘非0像素对其的支持程度来确定半径. 21HT方法最早在Illingworth的论文The Adaptive Hough Transform中提出并详细描述, 也可参照Yuen在1990年发表的A Comparative Study of Hough Transform Methods for Circle Finding, Bradski的《学习OpenCV》一书则对OpenCV中具体对算法的具体实现有详细描述并讨论了霍夫梯度法的局限性.

例程

  1. 这个例程是用来干嘛的?

    • 加载一幅图像并对其模糊化以降噪
    • 对模糊化后的图像执行霍夫圆变换 .
    • 在窗体中显示检测到的圆.
  2. 下面要讲解的例程代码能从 这里 下载. 一个更高级的版本 (能同时演示标准霍夫圆变换和统计概率霍夫圆变换并带有可改变阈值的滑动条) 能从这里 找到.
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>using namespace cv;/** @function main */
int main(int argc, char** argv)
{Mat src, src_gray;/// Read the imagesrc = imread( argv[1], 1 );if( !src.data ){ return -1; }/// Convert it to graycvtColor( src, src_gray, CV_BGR2GRAY );/// Reduce the noise so we avoid false circle detectionGaussianBlur( src_gray, src_gray, Size(9, 9), 2, 2 );vector<Vec3f> circles;/// Apply the Hough Transform to find the circlesHoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows/8, 200, 100, 0, 0 );/// Draw the circles detectedfor( 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 centercircle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );// circle outlinecircle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );}/// Show your resultsnamedWindow( "Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE );imshow( "Hough Circle Transform Demo", src );waitKey(0);return 0;
}

说明

  1. 加载一幅图像

    src = imread( argv[1], 1 );if( !src.data ){ return -1; }
    

  2. 转成灰度图:

    cvtColor( src, src_gray, CV_BGR2GRAY );
    

  3. 执行高斯模糊以降低噪声:

    GaussianBlur( src_gray, src_gray, Size(9, 9), 2, 2 );
    

  4. 执行霍夫圆变换:

    vector<Vec3f> circles;HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows/8, 200, 100, 0, 0 );
    

    函数带有以下自变量:

    • src_gray: 输入图像 (灰度图)
    • circles: 存储下面三个参数:  集合的容器来表示每个检测到的圆.
    • CV_HOUGH_GRADIENT: 指定检测方法. 现在OpenCV中只有霍夫梯度法
    • dp = 1: 累加器图像的反比分辨率
    • min_dist = src_gray.rows/8: 检测到圆心之间的最小距离
    • param_1 = 200: Canny边缘函数的高阈值
    • param_2 = 100: 圆心检测阈值.
    • min_radius = 0: 能检测到的最小圆半径, 默认为0.
    • max_radius = 0: 能检测到的最大圆半径, 默认为0
  5. 绘出检测到的圆:

    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 centercircle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );// circle outlinecircle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );}
    

    你将会看到圆用红色绘出而圆心用小绿点表示

  6. 显示检测到的圆:

    namedWindow( "Hough Circle Transform Demo", CV_WINDOW_AUTOSIZE );
    imshow( "Hough Circle Transform Demo", src );
    

  7. 等待用户按键结束程序

    waitKey(0);
    

HoughCircles 函数相关推荐

  1. HoughCircles()函数 画圆心和圆的轮廓

    代码如下: #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespa ...

  2. cv2.HoughCircles函数的参数

    内容来自OpenCV-Python Tutorials 自己翻译整理 目标: 使用霍夫变换在图像中寻找圆 使用函数cv2.HoughCircles() 原理: 圆形的表达式为(x−xcenter)2+ ...

  3. 通过OpenCv的HoughCircles函数获取图片中的圆形

    话不多说,代码如下: int main(){Mat srcImage,grayImage;/*加载图片*/srcImage = imread(path);/*判断加载是否成功*/if(srcImage ...

  4. OpenCV3学习(6.2)——霍夫(Hough)变换:霍夫线变换HoughLine,霍夫圆变换HoughCircles

    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段) ...

  5. Python四:HoughCircles()霍夫变换

    [检测圆心的方法] 圆心是它所在圆周所有法线的交汇处,因此只要找到这个交点,即可确定圆心,该方法所用的霍夫空间与图像空间的性质相同,因此它仅仅是二维空间.检测圆半径的方法是从圆心到圆周上的任意一点的距 ...

  6. OpenCV-霍夫圆变换cv::HoughCircles

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数原型 void HoughCircles( InputArray image, Output ...

  7. linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用

    目录 Table of Contents 目录 一 源码编译和安装 添加opencv路径 二 增加并列子函数的方法 三 增加库函数形参的方法 四 cv增加子函数一些数据变量的问题 4.1 数据类型 一 ...

  8. OpenCV4一部分函数目录

    OpenCV4函数+基本功能说明 引言 一.基础函数使用 Imread函数--读取图片 namedWindow函数--创建自定名窗口 imshow函数--将自定名的窗口展示 destroyWindow ...

  9. opencv使用霍夫圆算法HoughCircles进行圆检测

    原理介绍: opencv -- HoughCircles 霍夫圆变换原理及圆检测 霍夫变换(Hough Transform) 霍夫变换 - 圆检测 (Hough Circle transform) 霍 ...

最新文章

  1. Flex技术中的陷阱
  2. 字符的点阵显示(模拟户外广告显示屏)
  3. python decode hex_在python2.7中使用b64decode()将base64转换为hex
  4. 如何画架构图之C4模型画法
  5. mysql windows ad_您可以使用PHP获得Windows(AD)用户名吗?
  6. 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)...
  7. 全国计算机等级考试题库二级C操作题100套(第59套)
  8. python mock_python mock基本使用
  9. 谈谈App的混合开发
  10. python3pygame 游戏程序_python3 pygame实现接小球游戏
  11. NHibernate版本不一致问题
  12. 共模电压 matlab,SPWM死区对三电平高压变频器共模电压的影响
  13. 微信测试是否被删软件,检测微信好友是否把你删除的3种方法,最后一种最好用!...
  14. SAP 消息号 KE391:在 CO-PA中分配条件类型PR00的问题
  15. Python结巴中文分词工具使用过程中遇到的问题及解决方法
  16. 报名 | 张钹院士任首席顾问:首届“清华大学国强研究院杯”
  17. html鼠标悬停模糊,模糊效果鼠标悬停清晰
  18. RGB图像转换为灰度图像的原理
  19. 计算机键盘被锁怎么解,解开电脑键盘锁的小窍门
  20. 冰河联合猫大人又出版一本分布式事务领域的开山之作,这是要再次起飞了吗?

热门文章

  1. 11月17日spring mvc入门培训
  2. Android JNI 使用的数据结构JNINativeMethod详解
  3. 如果C++程序要调用已经被编译后的C函数,该怎么办?
  4. Kotlin系列之类和属性
  5. R 中的哪些命令或者包让你相见恨晚?--转载知乎
  6. 登录环境故障的原理及解决办法? -bash-4.1$ -bash-4.1$
  7. 1-1-2 交叉编译工具链
  8. 中小企业实施ERP更多是需要发展的眼光与坚定的决策
  9. 超强 css 实现 table 隔行 ,隔列 换色
  10. 转:Oracle SQL 内置函数大全 (一)