2015年9月26日 星期六

OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數

OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數:

其實在 OpenCV 2.4 的霍夫直線偵測轉換(Hough Line Transform)是有兩種函數,分別為 HoughLines HoughLinesP 來檢測圖像中的直線,HoughLines 是標準霍夫線變換和 HoughLinesP是統計概率霍夫線變換。函數 HoughLines 只能得到直線的參數 P ,θ 並不知道檢測到的直線的端點,而霍 HoughLinesP 是可以檢測到直線的兩個端點,筆者已經試驗了 HoughLines 來檢測圖像中的直線,接下來便是測試 HoughLinesP 來檢測圖像中的直線了。

OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數
兩種霍夫線變換函數: 
1HoughLines 是標準霍夫線變換,原理在上面的部分已經說明了. 它能給我們提供一組參數對 (\theta, r_{\theta}) 的集合來表示檢測到的直線 
2HoughLinesP是統計概率霍夫線變換,這是執行起來效率更高的霍夫線變換. 它輸出檢測到的直線的端點 (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 )
image = 輸入圖像(8位單通道或二值化圖像)
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 lines;

                // 霍夫變換檢測直線
                HoughLinesP(mat_img, lines, 1, CV_PI/180, 80,50,10);

                // 依次在圖中繪製出每條線段
                for (size_t i=0; ilines.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%
天氣:微雨

沒有留言:

張貼留言