opencv学习日记——检测直线并绘制直线
1、图像处理结果
效果不尽人意,感觉还是适合单一图形的检测
2、代码部分
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//画出直线
void drawLine(Mat &img,
vector<Vec2f> lines,
double rows,
double cols,
Scalar scalar,
int n
)
{
Point pt1, pt2;
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0];
float theta = lines[i][1];
double a = cos(theta);
double b = sin(theta);
double x0 = a * rho, y0 = a * rho;
double length = max(rows, cols);
pt1.x = cvRound(x0 + length * (-b));
pt2.y = cvRound(y0 + length * (a));
pt1.x = cvRound(x0 - length * (-b));
pt2.y = cvRound(y0 - length * (a));
line(img, pt1, pt2, scalar, n);
}
}
int main()
{
Mat img = imread("a11.jpeg", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "输入图像为空";
return -1;
}
Mat edge;
//边缘检测
//Canny(原图, 新图, 阈值, 阈值, 卷积核大小)
Canny(img, edge, 400, 600, 3, false);
//二值化
//threshold(原图, 新图, 阈值, 阈值, 类型)
threshold(edge, edge, 100, 400, THRESH_BINARY);
vector<Vec2f> lines1, lines2;
//直线检测
//HoughLines(原图, 直线信息, 极坐标下的长度, 极坐标下的角度, 阈值, 距离分辨率除数, 弧度分辨率除数)
HoughLines(edge, lines1, 1, CV_PI / 180, 200, 0, 0);
HoughLines(edge, lines2, 1, CV_PI / 180, 150, 0, 0);
Mat img1, img2;
img.copyTo(img1);
img.copyTo(img2);
drawLine(img1, lines1, edge.rows, edge.cols, Scalar(255), 2);
drawLine(img2, lines2, edge.rows, edge.cols, Scalar(255), 2);
imshow("edge", edge);
imshow("img", img);
imshow("img1", img1);
imshow("img2", img2);
waitKey(0);
}