【OpenCV3经典编程100例】(18)线段检测:概率霍夫线变换HoughLinesP()函数

概率霍夫线变换HoughLinesP()函数进行线段检测!

API函数

void HoughLinesP(InputArray image,//输入图像,8位单通道的二值图像;输入图像可能被函数修改。
		OutputArray lines,//线段的输出向量,每一条线段由4个元素的向量(x1, y1, x2, y2)表示
		double rho, double theta,//直线搜索时的步进尺寸
		int threshold, //最小投票数
		double minLineLength = 0,//最低线段的长度,比这个设定参数短的线段就不能显现出来
		double maxLineGap = 0);//允许同一行点与点之间连接起来的最大距离

一、c++示例代码

//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分

//主函数
int main()
{
	//【1】载入图像
	Mat image = imread("F:\\opencvtest\\testImage\\airplane.jpg");
	//【2】检查是否载入成功
	if (image.empty())
	{
		printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
		return 0;
	}
	//【3】转换为灰度图像
	Mat grayImage;
	cvtColor(image, grayImage, COLOR_BGR2GRAY);
	//【4】图像平滑降噪
	Mat result;
	blur(grayImage, result, Size(3,3));
	//【5】Canny算子进行边缘检测
	Mat edge;
	Canny(result, edge, 30, 90, 3);
	//【6】概率霍夫变换、线段检测
	vector<Vec4i> lines;
	HoughLinesP(edge, lines, 1, CV_PI/180, 150, 30, 10);
	//【7】迭代器遍历向量,line()函数绘制线段
	std::vector<Vec4i>::const_iterator it = lines.begin();
	while (it != lines.end())
	{
		Point pt1((*it)[0], (*it)[1]);
		Point pt2((*it)[2], (*it)[3]);
		line(image, pt1, pt2, Scalar(55, 100, 195), 3, LINE_AA);
		++it;
	}
	//【8】显示图像
	imshow("17-线段检测图", image);
	//【9】保持窗口显示
	waitKey(0);
	return 0;
}

二、运行截图

线段检测图


猜你喜欢

转载自blog.csdn.net/misterjiajia/article/details/80383882
今日推荐