概率霍夫线变换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;
}
二、运行截图
线段检测图