本次实验是检测图像中的直线,用到了HoughLines()和HoughLinesP()函数,其中HoughLinesP()称为累计概率霍夫变换,实验结果显示累计概率霍夫变换要比标准霍夫变换的效果好。具体的参数介绍书中网上都有,可参照此博客https://www.cnblogs.com/skyfsm/p/6881686.html
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std; Mat midImage, dstImage; // 临时变量和目标图的定义
void HoughLines_p();
int main()
{
//载入原图
Mat src = imread("D:/bei1.jpg");
namedWindow("原图", CV_WINDOW_AUTOSIZE);
imshow("原图", src);
//先进行边缘检测 在进行灰度变换
Canny(src, midImage, , , );
imwrite("D:/learn-opencv/can.jpg", midImage);
cvtColor(midImage, dstImage, CV_GRAY2BGR); //进行霍夫线变换
vector<Vec2f>lines; //定义一个矢量结构lines用于存放得到的线段矢量集合
HoughLines(midImage, lines, , CV_PI / , , , ); //依次在图中做出每条线段
for (size_t i = ; i < lines.size(); i++)
{
float r = lines[i][];
float theta = lines[i][]; Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a * r, y0 = b * r;
pt1.x = cvRound(x0 + * (-b));
pt1.y = cvRound(y0 + * (a));
pt2.x = cvRound(x0 - * (-b));
pt2.y = cvRound(y0 - * (a)); line(dstImage, pt1, pt2, Scalar(, , ), , LINE_AA);
} //HoughLines_p();累积概率【霍夫变换】
imshow("边缘检测后的图", midImage);
imshow("显示效果图", dstImage);
imwrite("D:/learn-opencv/dstImage.jpg", dstImage);
waitKey();
return(); } //累积概率【霍夫变换】
void HoughLines_p()
{
vector<Vec4i>lines;
HoughLinesP(midImage, lines, , CV_PI / , , , ); for (size_t i = ; i < lines.size(); i++)
{
Vec4i l = lines[i];
line(dstImage, Point(l[], l[]), Point(l[], l[]), Scalar(, , ), , LINE_AA);
}
}
显示效果:
1.原图
2.canny边缘检测效果图
3.标准霍夫变换图
4.累计概率霍夫变换图