核心代码:
vector<Vec4f> lines;
HoughLinesP(t3, lines, 1, CV_PI / 180, 30, 10, 10);
for (size_t i = 0; i < lines.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
line(t1, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), color, 1, 8);
}
做霍夫变换之前记得提取图像边缘,是对图像边缘做霍夫变换
原理:
https://blog.csdn.net/ycj9090900/article/details/52944708
https://blog.csdn.net/abcjennifer/article/details/7448513
API:
HoughLines(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, // 生成极坐标时候的像素扫描步长
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double srn=0;// 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double stn=0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double min_theta=0; // 表示角度扫描范围 0 ~180之间, 默认即可
double max_theta=CV_PI ) // 一般情况是有经验的开发者使用,需要自己反变换到平面空间
HoughLinesP(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, //生成极坐标时候的像素扫描步长,一般为1
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double minLineLength=0;// 最小直线长度
double maxLineGap=0;// 最大间隔 )
扩充知识点:
size_t:
其实是一种类型,类似于无符号整形(unsignted int)。可以理解成unsignted int size,当unsignted int用就可以了。 size_t一般用于指明数一个组长度,所以必然是个正数。它有足够大的大小来储存可能的最大数组。比如要将下标赋值给数组a[array_size]的每个元素: const size_t array_size=10;int a[array_size-1];for(size_t i=0;i<size_t;++i )a[i]=i;说到底,size_t 当unsigned int用好了。
size_t是全局定义的类型;size_type是STL类中定义的类型属性,用以保存任意string和vector类对象的长度
Vector:https://www.cnblogs.com/youyoui/p/5779965.html
Vec4f :typedef Vec<float, 4>
是一个四元素的容器,Vec类其实是元素较少的向量
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
RNG rng(123456);
int i = 1,j=255;
Mat t1, t2,t3,t4,t5,t6;
char *c = "TRY";
void TRY(int, void*);
int main(int agrc, char** agrv) {
t1 = imread("hough.png");
if (!t1.data ) {
cout << "WRONG";
return -1;
}
cvtColor(t1, t2, CV_BGR2GRAY);
threshold(t2, t3, 0, 255, THRESH_OTSU);
Laplacian(t3, t3, -1, 3, 1, 0, BORDER_DEFAULT);
vector<Vec4f> lines;
HoughLinesP(t3, lines, 1, CV_PI / 180.0, 50, 10, 10);
for (size_t i = 0; i < lines.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
line(t1, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), color, 2, 8);
}
/*vector<Vec4f> plines;
HoughLinesP(t3, plines, 1, CV_PI / 180.0, 10, 0, 10);
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, 3, LINE_AA);
}*/
namedWindow("t1", 0);
imshow("t1", t1);
waitKey(0);
}