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);
}

 

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