C++ Opencv HoughLines()用霍夫变换在二元图像中寻线

一、霍夫变换简介

参考http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm


二、HoughLines()函数详解

该函数接受的输入矩阵只能是8位单通道的二值化灰度图。

三、代码及结果分享

#include<opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void myHough(Mat src, Mat dst)
{
	vector<Vec2f> lines;//用于储存参数空间的交点
	HoughLines(src, lines, 1, CV_PI / 180, 120, 0, 0);//针对不同像素的图片注意调整阈值
	const int alpha = 1000;//alpha取得充分大,保证画出贯穿整个图片的直线
	//lines中存储的是边缘直线在极坐标空间下的rho和theta值,在图像空间(直角坐标系下)只能体现出一个点
	//以该点为基准,利用theta与斜率之间的关系,找出该直线上的其他两个点(可能不在图像上),之后以这两点画出直线
	for (size_t i = 0; i < lines.size(); i++)
	{
		float rho = lines[i][0], theta = lines[i][1];
		double cs = cos(theta), sn = sin(theta);
		double x = rho * cs, y = rho * sn;
		Point pt1(cvRound(x + alpha * (-sn)), cvRound(y + alpha * cs));
		Point pt2(cvRound(x - alpha * (-sn)), cvRound(y - alpha * cs));
		line(dst, pt1, pt2, Scalar(0, 0, 255), 1, LINE_AA);
	}
}

int main()
{
	Mat mImage = imread("box.jpg");
	if (mImage.data == 0)
	{
		cerr << "Image reading error !" << endl;
		system("pause");
	}
	namedWindow("The original image", WINDOW_NORMAL);
	imshow("The original image", mImage);

	Mat mMiddle ;
	cvtColor(mImage, mMiddle,  COLOR_BGR2GRAY);//Canny()只接受单通道8位图像,边缘检测前先将图像转换为灰度图
	Canny(mImage, mMiddle, 50, 150, 3);//边缘检测,检测结果作为霍夫变换的输入
	Mat mResult = mImage.clone();
	myHough(mMiddle, mResult);//将结果展示在原图像上
	namedWindow("The processed image", WINDOW_NORMAL);
	imshow("The processed image", mResult);
	waitKey();
	destroyAllWindows();
	return 0;
}

 

 

2022农历新年附:

  时光如白驹过隙,转眼毕业参加工作一年半了。步入社会后便在生活中疲于奔命,少了当年的书生意气。博客短期没有更新的打算,也实在没有精力维护。同学们留言的问题部分我也有看到,但博客内容久远,好多细节我也实在记不大清楚了,便没有回复。其实学问就是摸着石头过河,在探索中不断遇到问题,而独立解决问题的过程就是学习提高的过程。

  博主目前在shopee从事机器学习平台开发工作,部门及公司都在大力招聘中。福利待遇极好,工作1075,work life balance,待遇比肩字节。有兴趣的同学可以关注我新开的内推公众号“进击的虾仔”,帮你内推进入虾厂~

  江湖路远,大家后会有期~

posted @ 2018-08-06 20:49  秋沐霖  阅读(7572)  评论(0编辑  收藏  举报
Live2D