OpenCV笔记(二)---提取水平和垂直线/霍夫变换

膨胀腐蚀提取水平和垂直线

提取步骤

提取图片:

代码:

#include<opencv2/opencv.hpp>
#include<opencv2/core/mat.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main()
{
	Mat src;
	src = imread("C:/Users/LBJ/Desktop/OpenCVTest/tiqu.png");
	if (!src.data)
	{
		cout << "The iamge is empty" << endl;
		return -1;
	}
	namedWindow("Input_Image", WINDOW_AUTOSIZE);
	imshow("Input_Image", src);

	Mat gray_src;
	cvtColor(src, gray_src, CV_RGB2GRAY);
	Mat binImg;
	adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);

	Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
	Mat h_dst,v_dst;
	morphologyEx(binImg, h_dst, CV_MOP_OPEN, hline);
	morphologyEx(binImg, v_dst, CV_MOP_OPEN, vline);
	imshow("Hline_output", h_dst);
	imshow("Vline_output", v_dst);

	waitKey(0);
	return 0;
}

输出:

霍夫直线变换提取直线

将直线用极座标表示,把轮廓上的点的角度不断变化,所有的点“rho-theta”交于一点,即这些点在一条线上

函数:

//cv::HoughLines输出的是(theta,rho)极座标,HoughLinesP输出的是直线两点(x0,y0,x1,y1)
void HoughLines( InputArray image,        //输入图像,8bit灰度图像
                 OutputArray lines,       //输出极座标表示直线
                 doubl rho, double theta, //像素和角度步长,角度一般取CV_PI/180 
                 int threshold,           //阈值,多少曲线交点才看成直线
                 double srn = 0, double stn = 0, //是否用多尺度霍夫变换,0用经典
                 double min_theta = 0, double max_theta = CV_PI );
HoughLinesP( InputArray image, OutputArray lines,    //输出为Vec4i
             double rho, double theta, int threshold,//同上
             double minLineLength = 0,               //最小直线长度
             double maxLineGap = 0 );                //最大间隔

实战处理:

Canny(src, gray_src, 150, 200);       //输入图像求取边缘
cvtColor(gray_src, dst, CV_GRAY2BGR);
imshow("edge_image", gray_src);

vector<Vec4f> plines;                 //创建Vec4f的向量来储存直线石墨点
HoughLinesP(gray_src, plines, 1, CV_PI / 180, 5, 0, 5); //霍夫直线提取
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);
}

霍夫圆检测

1对噪声比较敏感,首先要对图像中值滤波滤波

void HoughCircles( InputArray image, OutputArray circles, //输入为8bit单通道灰度图像
                   int method,     //方法-HOUGH_GRANDIENT
                   double dp,      //一般等于1              
                   double minDist, //分辨亮圆的最短距离, src_arav.rows/8
                   double param1 = 100,   //Canny变换上阈值
                   double param2 = 100,   //中心点累加器阈值,候选圆心
                   int minRadius = 0, int maxRadius = 0 ); //最大半径最小半径

Mat medin;
medianBlur(src, medin, 3);           //中值滤波
cvtColor(medin, medin, CV_BGR2GRAY); //灰度处理

vector<Vec3f> pcircles;              //Vec3f类型向量,储存圆信息
HoughCircles(medin, pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 30, 5, 50);  //霍夫圆检测
	
for (size_t i = 0; i < pcircles.size(); i++)   //画圆,和圆心
{
	Vec3f circles = pcircles[i];
	circle(dst, Point(circles[0], circles[1]), circles[2], Scalar(0, 0, 255), 2, LINE_AA);
	circle(dst, Point(circles[0], circles[1]), 2, Scalar(255, 0, 255), 2, LINE_AA);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章