膨胀腐蚀提取水平和垂直线
提取步骤
提取图片:
代码:
#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);
}