其實在 OpenCV 2.4 的霍夫直線偵測轉換(Hough Line Transform)是有兩種函數,分別為 HoughLines 和 HoughLinesP 來檢測圖像中的直線,HoughLines 是標準霍夫線變換和 HoughLinesP是統計概率霍夫線變換。函數 HoughLines 只能得到直線的參數 P ,θ 並不知道檢測到的直線的端點,而霍 HoughLinesP 是可以檢測到直線的兩個端點,筆者已經試驗了 HoughLines 來檢測圖像中的直線,接下來便是測試 HoughLinesP 來檢測圖像中的直線了。
OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數 |
1‧HoughLines 是標準霍夫線變換,原理在上面的部分已經說明了. 它能給我們提供一組參數對 (\theta, r_{\theta}) 的集合來表示檢測到的直線
2‧HoughLinesP是統計概率霍夫線變換,這是執行起來效率更高的霍夫線變換. 它輸出檢測到的直線的端點 (x_{0}, y_{0}, x_{1}, y_{1})。
霍夫直線偵測轉換(Hough Line Transform) – HoughLinesP 函數:
// HoughLinesP函數
void void HoughLinesP(InputArray image, OutputArray lines, double rho,
double theta, int threshold, double minLineLength=0, double maxLineGap=0 )
|
lines = 是直線參數輸出,儲存著檢測到的直線的參數對 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器
rho = 是距離r的精度,即每個圖元對應的距離
theta = 是角度 θ 的解析度,即每個圖元對應的角度,使用 1度 (即 CV_PI/180)
threshold = 是累計值的閾值,大於這個閾值輸出相應的直線
minLinLength = 能組成一條直線的最少點的數量,點數量不足的直線將被拋棄
maxLineGap = 能被認為在一條直線上的亮點的最大距離
霍夫 HoughLinesP 函數直線變換方式:
1‧先隨機檢測出一部分直線,然後將直線上點的排查掉,再進行其他直線的檢測
2‧首先僅統計圖像中非零點的個數,對於已經確認是某條直線上的點就不再變換了
3‧對所以有非零點逐個變換到霍夫空間,並累加到霍夫統計表(圖像)中,並統計最大值
4‧最大值與閾值比較,小於閾值,則繼續下一個點的變換
5‧若大於閾值,則有一個新的直線段要產生了
6‧計算直線上線段的端點、長度,如果符合條件,則保存此線段,並 Mark 這個線段上的點不參與其他線段檢測的變換
霍夫直線偵測轉換(Hough Line Transform)程式 |
霍夫直線偵測轉換(Hough Line Transform)程式:
// 霍夫直線偵測轉換(Hough Line Transform)程式
// HoughLinesP函數
Mat mat_img;
IplImage*
img_hough;
// 載入原圖和Mat變數定義
Mat mat_src = imread(fileName,
CV_LOAD_IMAGE_COLOR);
img_hough =
&IplImage(mat_src);
// 轉化為灰度圖
cvtColor(mat_src,
mat_img, CV_BGR2GRAY);
// 用GaussianBlur消除雜訊
GaussianBlur(mat_img,
mat_img, cv::Size (5, 5), 1.5, 1.5); // GaussianBlur OK
// 用Canny對圖像進行邊緣檢測
Canny(mat_img,
mat_img, 100, 200,3);
// 存儲直線參數對的容器
std::vector
// 霍夫變換檢測直線
HoughLinesP(mat_img,
lines, 1, CV_PI/180, 80,50,10);
// 依次在圖中繪製出每條線段
for (size_t i=0; i<lines.size(); i++) {
Vec4i l =
lines[i];
line(mat_src, cvPoint(l[0], l[1]), cvPoint(l[2], l[3]), Scalar(255 , 0 ,
0),10, CV_AA);
}
// 顯示效果圖
pictureBox2->Image = gcnew
System::Drawing::Bitmap(img_hough->width,img_hough->height,
img_hough->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,
(System::IntPtr)
img_hough->imageData);
pictureBox2->Refresh();
} |
操作系統:Windows XP 32-bit
操作環境:Windows Visual Studio 2010 C++/CLI + OpenCV 2.4.8
相關網址:
※ 在 Windows XP Visual Studio 2010 安裝 OpenCV 2.4
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 第一個程式
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 使用 WebCam
※ 在 Windows XP Visual Studio 2010 安裝使用 FFmpeg 函數庫
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 使用 WebCam
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 顯示 IPCam 串流視頻
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 導入屬性工作表文件檔
※ 在 Windows XP Visual Studio 2010 使用 Windows From OpenCV 2.4 配置
※ 在 OpenCV 2.4 的 IplImage 資料結構
※ OpenCV 2.4 的坎尼圖像邊緣檢測(Canny Edge Detection) – Canny 函數
※ OpenCV 2.4 的霍夫直線偵測轉換 – HoughLines 函數
※ OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數
※ OpenCV 2.4 的人臉偵測(Face Detection)– cvHaarDetectObjects 函數
※ OpenCV 2.4 的物件偵測(Object Detection)– cvHoughCircles 函數
※ OpenCV 2.4 的物件追蹤(Object Tracking)– cvMoments 函數
2015 年 9月 26日 天氣報告
氣溫:28.9度 @ 20:40
相對濕度:百分之 91%
天氣:微雨