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,待遇比肩字节。有兴趣的同学可以关注我新开的内推公众号“进击的虾仔”,帮你内推进入虾厂~
江湖路远,大家后会有期~
原创:秋沐霖
博客主页:https://www.cnblogs.com/HL-space/
欢迎转载,转载请注明出处。
出错之处,敬请交流、雅正!
创作不易,您的 " 推荐 " 和 " 关注 " ,是给我最大的鼓励!
博客主页:https://www.cnblogs.com/HL-space/
欢迎转载,转载请注明出处。
出错之处,敬请交流、雅正!
创作不易,您的 " 推荐 " 和 " 关注 " ,是给我最大的鼓励!