opencv笔记二十一(霍夫变换直线)HoughLinesP(InputArray src, OutputArray lines, 1, CV_PI / 180, 30, 10, 10);

核心代码:

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类中定义的类型属性,用以保存任意stringvector类对象的长度

 

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);
}

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值