OpenCV学习(53)

Posted m0_53123717

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV学习(53)相关的知识,希望对你有一定的参考价值。

图像变换(7):标准霍夫变换:HoughLines()函数

此函数可以找出采用标准霍夫变换的二值图像线条。在 OpenCV中,我们可以用其来调用标准霍夫变换SHT和多尺度霍夫变换 MSHT的 OpenCV内建算法。

        第一个参数,InputArray类型的image,输入图像,即源图像。需为8位的单通道二进制图像,可以将任意的源图载入进来,并由函数修改成此格式后,再填在这里。
        第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量( p,0 )表示,其中,p是离坐标原点(0,0)(也  就是图像的左上角)的距离,0是弧度线条旋转角度(О度表示垂直线,Tt/2度表示水平线)。
        第三个参数,double类型的 rho,以像素为单位的距离精度。另一种表述方式是直线搜索时的进步尺寸的单位半径。(Latex 中/rho即表示p )
        第四个参数,double类型的theta,以弧度为单位的角度精度。另一种表述方式是直线搜索时的进步尺寸的单位角度。
        第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值 threshold的线段才可以被检测通过并返回到结果中。
        第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho 的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
        第七个参数,double类型的 stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和 stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。

学完函数解析后,看一个以HoughLines为核心的示例程序,就可以全方位了解 HoughLines函数的使用方法。

代码如下:
 

#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
#include<time.h>
using namespace std;
using namespace cv;

int main()

	cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
	Mat srcImage = imread("E:/pictures/2.jpg");
	Mat midImage, dstImage;

	Canny(srcImage, midImage, 50, 200, 3);
	cvtColor(midImage, dstImage, COLOR_GRAY2BGR);

	vector<Vec2f>lines;
	HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);

	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));

		line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
	

	imshow("【原始图】", srcImage);
	imshow("【边缘检测后的图】", midImage);
	imshow("【效果图】", dstImage);

	waitKey(0);
	return 0;


运行截图:

 

 

 

 

以上是关于OpenCV学习(53)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV学习(53)

OpenCV 学习笔记(重采样和图像缩放)

opencv学习-入门系列汇总

OpenCV-字典法实现数字识别(尺寸归一化+图像差值)

opencv标定板像素尺寸

opencv学习-边缘填充