IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> C++OpenCV系统学习(9)——霍夫变换 -> 正文阅读

[人工智能]C++OpenCV系统学习(9)——霍夫变换

1.霍夫直线变换

?1.1概述

Hough Line Transform用来做直线检测,前提条件是边缘检测已经完成(Canny边缘检测),它是由平面空间到极坐标空间转换。

1.2霍夫直线变换原理

? ? ? ?他是通过把图像上的所有像素点都变成极坐标空间,然后形成一条一条的曲线,如果所有的曲线都相交在一个点,那么这个点对应的\theta和r值就表示直线的角度。这就说明在屏幕坐标上的直线,在极坐标空间找到了,我们拿到了\theta和r重新反算到平面空间。

1.3补充

? ? ? ? ?对于任意一条直线上的所有点来说,变换到极坐标中,从[0,360]空间,可以得到r的大小,属于同一条直线上点在极坐标空(r,theta)必然在一个点上有最强的信号出现,跟几乎此反算到屏幕坐标中就可以得到直线上个点的像素坐标,从而得到直线。

?1.4 相关的API

  • 标准的霍夫变换cv::HoughLines从平面坐标转换到霍夫空间,最终输出(\theta,r)表示极坐标空间
  • 霍夫变换直线概率,cv::HoughLinesP最终输出的是直线的两个点(x0,y0,x1,y1)

下面的API不建议使用:

?建议使用的API:

?1.5 霍夫直线检测案例

void MyApi::HoughTranslate(Mat& image)
{
	//做边缘检测首先要进行高斯边缘模糊,如果利用Canny高斯边缘模糊Canny会帮我们做
	Mat image_gray, dst;
	Canny(image, image_gray, 150, 200);//100,200分别是低阈值和高阈值输出二值图
	imshow("edge_image", image_gray);
	cvtColor(image_gray, dst, COLOR_GRAY2BGR);

	vector<Vec4f> plines;//吧每个像素点的平面坐标转化为极坐标产生的曲线放入集合中
	HoughLinesP(image_gray, plines, 1, CV_PI / 180.0, 10, 0, 10);//从平面坐标转换到霍夫空间,最终输出的是直线的两个点(x0,y0,x1,y1)
	Scalar color = Scalar(0, 0, 255);
	for (size_t i = 0; i < plines.size(); i++)
	{
		Vec4f hline = plines[i];
		line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3, LINE_AA);
	}
	imshow("hough_line_detection", dst);

}

结果如下所示:

上图分别是输入图像、边缘检测结果、以及霍夫直线检测的结果?

?2.霍夫圆检测

?2.1霍夫圆检测原理

?

????????从平面坐标圆上的点到极坐标转换的三个参数C(x0,y0,r)其中x0,y0是圆心,r 取一固定值时theta扫描360度,x y 跟着变化, 若多个边缘点对应的三维空间曲线交于一点,则他们在共同圆上,在圆心处有累积最大值,也可以用同样的阈值的方法来判断一个圆是否被检测到。

?注:

????????因为霍夫圆检测对噪声比较敏感,所以首先要对图像做滤波(模糊降噪)。(比如椒盐噪声用中值滤波,其他的也可以用高斯模糊)

????????基于效率考虑,Opencv中实现的霍夫变换圆检测是基于图像梯度(霍夫梯度法, 也叫2-1霍夫变换(21HT))的实现,分为两步(已封装到HoughCircles):

? ? ? ? 第一步:?Canny检测边缘,发现可能的圆心。圆心一定是在圆上的每个点的模向量上, 这些圆上点模向量的交点就是圆心, 霍夫梯度法的第一步就是找到这些圆心, 这样三维的累加平面就又转化为二维累加平面。

????????第二步:基于第一步的基础上从候选圆心开始计算最佳半径大小。第二步根据所有候选中心的边缘非0像素对其的支持程度来确定半径。

HoughCircles(
InputArray image, // 输入图像 ,必须是8位的单通道灰度图像,8位可以有4个通道,每个通道是8位,可以使RGB。
OutputArray circles, // 输出结果,发现的圆信息(数组)
Int method, // 选梯度方法 - HOUGH_GRADIENT
Double dp, // dp = 1,原图尺度(2的话比原图小一半来寻找,速度快了)
Double mindist, // 10 半径最短距离-可以分辨是两个圆的,否则认为是半径不同的同心圆- src_gray.rows/8
Double param1, // canny边缘检测的低阈值canny edge detection low threshold
Double param2, // 中心点累加器阈值 – 候选圆心
Int minradius, // 圆最小半径
Int maxradius//圆最大半径(范围越大,速度越慢)
)

2.2案例分析

void MyApi::HoughCircleTranslate(Mat& image)
{
	Mat m_image,m_gray_image,dst;
	//首先需要中值滤波
	medianBlur(image, m_image,3);
	cvtColor(m_image, m_gray_image, COLOR_BGR2GRAY);

	//霍夫圆检测
	vector<Vec3f>pcircles;//把可能的圆放进容器
	HoughCircles(m_gray_image, pcircles, HOUGH_GRADIENT, 1, 10, 100,30,5,50);
	image.copyTo(dst);
	for (size_t i = 0; i < pcircles.size(); i++)
	{
		Vec3f cc = pcircles[i];//找到第i个圆,然后我们需要在dst图上画出来
		//绘制圆
		circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 0, 255), 2, LINE_AA);
		//标准圆心的颜色
		circle(dst, Point(cc[0], cc[1]), 2, Scalar(98, 23, 255), 2, LINE_AA);

	}
	imshow("输出结果", dst);
}

?原始图像和输出结果如上图所示,圆形被检测出来

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:06:37  更:2021-08-26 12:09:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:23:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码