【OpenCV】提取并标注图像中的直线

提取并标注图像中的直线

使用Canny算法
原图
在这里插入图片描述在这里插入图片描述
Canny检测图
在这里插入图片描述在这里插入图片描述
Canny彩色图
在这里插入图片描述在这里插入图片描述
(1)转成灰度图
在这里插入图片描述
(2)降噪
在这里插入图片描述
(3)使用Canny算子
在这里插入图片描述
(4)使用Canny算子输出的边缘图作为掩码,来将原图拷到目标图中

在这里插入图片描述
Canny程序

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;

//-------------------------------------------------------------------------------  
//  CV&AR:Canny
//	Auther: 1210
//	Date:2019/03/21
//-------------------------------------------------------------------------------  
int main()
{
	//载入原始图  
	Mat srcImage = imread("2.jpg"); 
	Mat srcImage1 = srcImage.clone();

	//显示原始图 
	imshow("src 1210", srcImage);

	//canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图

	Mat dstImage, edge, grayImage;

	//创建与src同类型和大小的矩阵(dst)
	dstImage.create(srcImage1.size(), srcImage1.type());

	//将原图像转换为灰度图像
	cvtColor(srcImage1, grayImage, COLOR_BGR2GRAY);

	//先用使用 3x3内核来降噪
	blur(grayImage, edge, Size(3, 3));

	//运行Canny算子
	Canny(edge, edge, 3, 9, 3);

	//将g_dstImage内的所有元素设置为0 
	dstImage = Scalar::all(0);

	//使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
	srcImage1.copyTo(dstImage, edge);

	imshow("Canny 1210", edge);
	imshow("ColorCanny 1210", dstImage);

	waitKey(0);
	return 0;
}

使用Hough算法

原图
在这里插入图片描述在这里插入图片描述
Canny边缘检测
在这里插入图片描述在这里插入图片描述
Hough直线检测

在这里插入图片描述在这里插入图片描述
(1)边缘检测并转化为灰度图
在这里插入图片描述
(2)Hough检测
在这里插入图片描述
(3)标注直线

在这里插入图片描述
Hough程序

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;

//-------------------------------------------------------------------------------  
//  CV&AR:Hough
//	Auther:1210
//	Date:2019/03/21
//-------------------------------------------------------------------------------  
int main()
{   
	Mat srcImage = imread("2.jpg");  
	Mat midImage, dstImage;

	//进行边缘检测和转化为灰度图
	Canny(srcImage, midImage, 50, 200, 3);
	cvtColor(midImage, dstImage, COLOR_GRAY2BGR);

	//进行霍夫线变换
	vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
	HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);
	//依次在图中绘制出每条线段
	for (size_t i = 0; i < lines.size(); i++)
	{
		Vec4i l = lines[i];
		line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);
	}
  
	imshow("src 1210", srcImage);
	imshow("Canny 1210", midImage); 
	imshow("Hough 1210", dstImage);

	waitKey(0);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/iefenghao/article/details/88725106