膨脹腐蝕提取水平和垂直線
提取步驟
提取圖片:
代碼:
#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);
}