一、霍夫變換簡介
參考http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm
二、HoughLines()函數詳解
該函數接受的輸入矩陣只能是8位單通道的二值化灰度圖。
三、代碼及結果分享
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void myHough(Mat src, Mat dst)
{
vector<Vec2f> lines;//用於儲存參數空間的交點
HoughLines(src, lines, 1, CV_PI / 180, 120, 0, 0);//針對不同像素的圖片注意調整閾值
const int alpha = 1000;//alpha取得充分大,保證畫出貫穿整個圖片的直線
//lines中存儲的是邊緣直線在極坐標空間下的rho和theta值,在圖像空間(直角坐標系下)只能體現出一個點
//以該點為基准,利用theta與斜率之間的關系,找出該直線上的其他兩個點(可能不在圖像上),之后以這兩點畫出直線
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
double cs = cos(theta), sn = sin(theta);
double x = rho * cs, y = rho * sn;
Point pt1(cvRound(x + alpha * (-sn)), cvRound(y + alpha * cs));
Point pt2(cvRound(x - alpha * (-sn)), cvRound(y - alpha * cs));
line(dst, pt1, pt2, Scalar(0, 0, 255), 1, LINE_AA);
}
}
int main()
{
Mat mImage = imread("box.jpg");
if (mImage.data == 0)
{
cerr << "Image reading error !" << endl;
system("pause");
}
namedWindow("The original image", WINDOW_NORMAL);
imshow("The original image", mImage);
Mat mMiddle ;
cvtColor(mImage, mMiddle, COLOR_BGR2GRAY);//Canny()只接受單通道8位圖像,邊緣檢測前先將圖像轉換為灰度圖
Canny(mImage, mMiddle, 50, 150, 3);//邊緣檢測,檢測結果作為霍夫變換的輸入
Mat mResult = mImage.clone();
myHough(mMiddle, mResult);//將結果展示在原圖像上
namedWindow("The processed image", WINDOW_NORMAL);
imshow("The processed image", mResult);
waitKey();
destroyAllWindows();
return 0;
}