偷偷拿来记录一下萌新的cs路——day 45 暑假作业用的霍夫变换检测直线
原理:平面直角坐标系中的点在霍夫空间中是直线,平面直角坐标系中的直线在霍夫空间中是点。
个人理解本质上是空间变换,建立极坐标系与平面直角坐标系的映射,由一一对应的映射关系反推原本坐标系的直线。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc,char** argv)
{
Mat src, src_gray, dst;
src = imread("test.png");
// 检测图片是否存在
if (src.empty()) {
cout << "Image does not exist. " << endl;
return -1;
}
char INPUT_TITLE[] = "original";
char OUTPUT_TITLE[] = "hough-line-detection";
namedWindow(INPUT_TITLE, WINDOW_AUTOSIZE);
namedWindow(OUTPUT_TITLE, WINDOW_AUTOSIZE);
imshow(INPUT_TITLE, src);
// Canny提取边缘
Canny(src, src_gray, 100, 200);
cvtColor(src_gray, dst, COLOR_GRAY2BGR);
imshow("edge", src_gray);
// 霍夫检测
vector<Vec4f> plines;
HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 0);
Scalar color = Scalar(0, 0, 255); // 定义画线颜色
for (size_t i = 0; i < plines.size(); i++) {
Vec4f hline = plines[i];
line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 2, LINE_AA); // color:颜色;2:直线厚度
}
imshow(OUTPUT_TITLE, dst);
waitKey(0);
return 0;
}
运行结果
学了更多知识还会回来更新的!有误之处请大佬指正,非常感谢!