• c++视觉处理---霍夫变换


    霍夫直线变换的函数

    HoughLinesOpenCV库中用于执行霍夫直线变换的函数。霍夫直线变换用于检测图像中的直线。下面是该函数的基本用法:

    cv::HoughLines(image, lines, rho, theta, threshold);
    
    • 1
    • image: 输入的二值图像,通常是通过边缘检测算法生成的。
    • lines: 存储检测到的直线的容器。
    • rho: 霍夫空间中的距离分辨率。通常设置为像素。
    • theta: 霍夫空间中的角度分辨率。通常设置为弧度。
    • threshold: 用于判断直线是否检测成功的阈值。只有当投票数大于等于此阈值时,才会被认为检测到一条直线。

    cv::HoughLines 函数将在输入图像上执行霍夫直线变换,识别直线,并将检测到的直线的参数 (ρ, θ) 存储在 lines 容器中。每个检测到的直线都由 (ρ, θ) 表示,其中 ρ 是距离原点的距离,θ 是直线的角度。您可以在 lines 容器中访问这些参数。

    以下是一个使用 cv::HoughLines 的简单示例:

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    using namespace cv; //包含cv命名空间
    #include 
    
    //----------------- 【main()函数】--------------------------
    // 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
    //
    int main()
    {
    	//【1】载入原始图和 Mat变量定义
    	Mat srcImage = imread("113.jpg"); //工程目录下应该有一张名为1. jpg的素材图
    	Mat midImage, dstImage;//临时变量和目标图的定义
    	//【2】进行边缘检测和转化为灰度图
    	Canny(srcImage, midImage, 50, 200, 3);//进行一此 canny边缘检测
    	cvtColor(midImage, dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
    	//【3】进行霍夫线变换
    	vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
    	HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );
    	//【4】依次在图中绘制出每条线段
    	for (size_t i = 0; i < lines.size(); i++)
    	{
    		float rho = lines[i][0], theta = lines[i][1];
    		Point pt1, pt2;
    		double a = cos(theta), b = sin(theta);
    		double x0 = a * rho, y0 = b * rho;
    		pt1.x = cvRound(x0 + 1000 * (-b));
    		pt1.y = cvRound(y0 + 1000 * (a));
    		pt2.x = cvRound(x0 - 1000 * (-b));
    		pt2.y = cvRound(y0 - 1000 * (a));
    		//此句代码的OpenCV2版为:
    		//line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);
    		//此句代码的 OpenCV3版为:
    		line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
    	}
    	//【5】显示原始图
    	imshow("【原始图】", srcImage);
    	//【6】边缘检测后的图
    	imshow("【边缘检测后的图】", midImage);
    	//【7】显示效果图
    	imshow("【效果图】", dstImage);
    	waitKey(0);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    累计概率霍夫变换: HoughLinesP()函数

    cv::HoughLinesP 是OpenCV库中用于执行概率霍夫直线变换(Probabilistic Hough Line Transform)的函数。概率霍夫直线变换与传统霍夫直线变换不同,它不需要计算每个像素的直线参数 (ρ, θ),而是通过连接边缘点的局部段来检测线段。这可以显著提高速度,特别是在处理大型图像时。

    以下是 cv::HoughLinesP 函数的基本用法:

    cv::HoughLinesP(image, lines, rho, theta, threshold, minLineLength, maxLineGap);
    
    • 1
    • image: 输入的二值图像,通常是通过边缘检测算法生成的。
    • lines: 存储检测到的直线段的容器。
    • rho: 霍夫空间中的距离分辨率。通常设置为像素。
    • theta: 霍夫空间中的角度分辨率。通常设置为弧度。
    • threshold: 用于判断线段是否检测成功的阈值。只有当线段上的点数大于等于此阈值时,才会被接受。
    • minLineLength: 最小线段长度。任何短于此长度的线段都会被忽略。
    • maxLineGap: 允许将同一线段的两个线段断开的最大距离。

    cv::HoughLinesP 函数将在输入图像上执行概率霍夫直线变换,识别线段,并将检测到的线段的起始点和终止点存储在 lines 容器中。

    以下是一个简单的示例,演示如何使用 cv::HoughLinesP 检测线段:

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    using namespace cv; //包含cv命名空间
    #include 
    //--【main()函数】 -//- -------- ---- -------------
    // 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
    //.
    int main()
    {
    	//【1】载入原始图和Mat变量定义
    	Mat srcImage = imread("113.jpg"); //工程目录下应该有一张名为1. jpg的素材图
    	Mat midImage, dstImage;//临时变量和目标图的定义
    	//【2】进行边缘检测和转化为灰度图
    	Canny(srcImage, midImage, 50, 200, 3);//进行一此 canny边缘检测
    	cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
    	//【3】进行霍夫线变换
    	vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10 );
    	//【4】依次在图中绘制出每条线段
    	for (size_t i = 0; i < lines.size(); i++)
    	{
    		Vec4i l = lines[i];
    		line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);
    
    		//此句代码的OpenCV2版为:
    	//line( dstImage, Point(1[0], 1[1]), Point(1[2], 1[3]),Scalar(186,88,255), 1, CV_AA);
    	//此句代码的OpenCV3版为:
    		
    	}
    	//【5】显示原始图
    	imshow("【原始图】", srcImage);
    	//【6】边缘检测后的图
    	imshow("【边缘检测后的图】", midImage);
    	//【7】显示效果图
    	imshow("【效果图】", dstImage);
    	waitKey(0);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    这个示例加载了经过边缘检测的图像,然后使用 cv::HoughLinesP 函数检测线段,并在图像上绘制检测到的线段。请确保在 cv::HoughLinesP 函数中适当调整距离分辨率、角度分辨率、阈值、最小线段长度和最大线段断开距离以获得最佳的结果。
    在这里插入图片描述

    霍夫圆变换的函数:cv::HoughCircles

    cv::HoughCircles 是OpenCV库中用于执行霍夫圆变换的函数。霍夫圆变换用于检测图像中的圆。以下是 cv::HoughCircles 函数的基本用法:

    cv::HoughCircles(image, circles, cv::HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius);
    
    • 1
    • image: 输入的灰度图像,通常是通过边缘检测和预处理生成的。
    • circles: 存储检测到的圆的容器。
    • method: 用于检测圆的方法,通常使用 cv::HOUGH_GRADIENT
    • dp: 累加器分辨率与图像分辨率的比例。通常设置为1。
    • minDist: 检测到的圆之间的最小距离。
    • param1: Canny边缘检测的高阈值。
    • param2: 累加器阈值,用于确定检测到的圆。
    • minRadius: 允许的最小圆半径。
    • maxRadius: 允许的最大圆半径。

    cv::HoughCircles 函数将在输入图像上执行霍夫圆变换,识别圆,并将检测到的圆的圆心坐标和半径存储在 circles 容器中。

    以下是一个简单的示例,演示如何使用 cv::HoughCircles 检测圆:

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    using namespace cv; //包含cv命名空间
    #include 
    //----【main()函数】------ -------- -
    // 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
    int main()
    {
    	//【1】载入原始图、Mat 变量定义
    	Mat srcImage = imread("2144.jpg"); //工程目录下应该有一张名为1. jpg的素材图
    	Mat midImage, dstImage;//临时变量和目标图的定义
    	//【2】显示原始图
    	imshow("【原始图】", srcImage);
    	//【3】转为灰度图并进行图像平滑
    	cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//转化边缘检测后的图为灰度图
    	GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);
    	//【4】进行霍夫圆变换
    	vector<Vec3f> circles;
    	HoughCircles(midImage, circles, HOUGH_GRADIENT, 1.5, 10, 200, 100, 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(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    		//绘制圆轮廓
    		circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
    	}
    	//【6】显示效果图
    	imshow("【效果图】", srcImage);
    	waitKey(0);
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    【编程之路】面试必刷TOP101:动态规划(入门)(62-66,Python实现)
    数据结构之单链表基本操作
    线性代数_同济第七版
    大专三年总结2019-2022
    web前端期末大作业 html+css+javascript汽车介绍网页设计实例 企业网站制作(带报告3490字)
    低代码: 系统开发准备之确定一般开发流程,需求分析,复杂度分析,标准开发流程
    若依使用EasyExcel导入和导出数据
    点云从入门到精通技术详解100篇-基于光谱共焦系统的三维点云数据处理(下)
    WebGPU的计算着色器实现冒泡排序
    读《DevOps实践指南》有感
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133762107