概述:主要目的是为了在图像中获取所需要的特征信息,比如直线或者圆等
一、标准霍夫变换
cv::Mat midImage, dstImage;
/// 边缘检测 转化灰度图
cv::Canny(image, midImage, 50, 200, 3);
cv::cvtColor(midImage, dstImage, CV_GRAY2BGR);
/// 进行霍夫线变换
std::vector<cv::Vec2f> lines; ///存放得到线段矢量集合
cv::HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0);
/// 绘制每条线段
for(int i = 0; i<lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
cv::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));
cv::line(dstImage, pt1, pt2, cv::Scalar(0, 255, 0), 1, cv::LINE_AA);
}
cv::imshow("midImage", midImage);
cv::imshow("dstImage", dstImage);
二、累计概率霍夫变换
cv::Mat midImage, dstImage;
/// 边缘检测 转化灰度图
cv::Canny(image, midImage, 50, 200, 3);
cv::cvtColor(midImage, dstImage, CV_GRAY2BGR);
/// 霍夫线变换
std::vector<cv::Vec4i> lines; ///存放得到线段矢量集合
cv::HoughLinesP(midImage, lines, 1, CV_PI/180, 80, 50, 10);
/// 绘制每条线段
for(int i = 0; i<lines.size(); i++)
{
cv::Vec4i l = lines[i];
cv::line(dstImage, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]),cv::Scalar(0, 255, 0),1, cv::LINE_AA);
}
cv::imshow("midImage", midImage);
cv::imshow("dstImage", dstImage);
总结:两种效果都不好,可能是我的图片太复杂了
好了,后面学习重映射、仿射变换