2015年9月20日 星期日

OpenCV 2.4 的坎尼圖像邊緣檢測(Canny Edge Detection) – Canny 函數

OpenCV 2.4 的坎尼圖像邊緣檢測(Canny Edge DetectionCanny 函數

筆者將來需要用奧尼(Aoni)百腦通相影 HD720P 高清網絡攝像頭(Webcam)作智能小車或機械人的圖像處理,所以圖像邊緣檢測是必須的,在 OpenCV 內有坎尼邊緣檢測(Canny Edge Detector )函數,坎尼邊緣檢測(Canny Edge Detector )是由 John F. Canny1986年開發的,將來智能小車或機械人行走時便要使用這函數。

OpenCV 2.4 的坎尼圖像邊緣檢測(Canny Edge Detection
坎尼圖像邊緣檢測(Canny Edge Detection)的主要算法(Algorithm):
1Low error rateMeaning a good detection of only existent edges 
2Good localizationThe distance between edge pixels detected and real edge pixels have to be minimized 
3Minimal responseOnly one detector response per edge 

Canny 邊緣檢測演算法可以分為以下 5 個步驟: 
1應用高斯濾波來平滑圖像,目的是去除雜訊。 
2找尋圖像的強度梯度(intensity gradients)。
3應用非最大抑制(non-maximum suppression)技術來消除邊誤檢(本來不是但檢測出來是)。
4應用雙閾值的方法來決定可能的(潛在的)邊界。
5利用滯後技術來跟蹤邊界。
 
操作系統:Windows XP 32-bit 
操作環境:Windows Visual Studio 2010 C++/CLI + OpenCV 2.4.8

坎尼圖像邊緣檢測(Canny Edge Detection)程式:
// 圖像邊緣檢測
// Canny Edge Detection - Canny 函數

int edgeThresh     = 50;
IplImage *pImgGray = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U, 1);
IplImage *pImgEdge = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U, 1);

cvCvtColor(pImg, pImgGray, CV_BGR2GRAY);
cvCanny(pImgGray, pImgEdge, edgeThresh, edgeThresh*3, 3);
                    
int step       = pImgEdge->widthStep;
uchar* oData   = (uchar*)pImgEdge->imageData;
IplImage* nImg = cvCreateImage(cvSize(pImgEdge->width,pImgEdge->height),IPL_DEPTH_8U,3);

int nStep      = nImg->widthStep;
int nChannels  = nImg->nChannels;
uchar* nData   = (uchar *)nImg->imageData;

     for (int j = 0; jheight; j++){
            for (int i = 0; iwidth; i++){
                 int counter = j*nStep + i*nChannels;
                 nData[counter+ 0] = oData[j*step + i];  // Blue
                 nData[counter+ 1] = oData[j*step + i];  // Green
                 nData[counter+ 2] = oData[j*step + i];  // Red
                 }                  
            }                  

    pictureBox2->Image  = gcnew System::Drawing::Bitmap(frame->width,frame->height,
    frame->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,
    (System::IntPtr) nImg->imageData);
    pictureBox2->Refresh();
} // End If Canny Edge Detection

OpenCV 中的 Canny 函數:
採用 Canny 演算法做邊緣檢測
void cvCanny( const CvArr* image, CvArr* edges, double threshold1,double threshold2, int aperture_size=3 );
image = 輸入圖像 
edges = 的邊緣圖像
threshold1 = 一個閾值
threshold2 = 第二個閾值
aperture_size = Sobel 運算元內核大小 ( cvSobel)
 函數 cvCanny 採用 CANNY 演算法發現輸入圖像的邊緣而且在輸出圖像中標識這些邊緣。threshold1 threshold2 當中的小閾值用來控制邊緣連接,大的閾值用來控制強邊緣的初始分割。

相關網址:
※ 在 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月 20日 天氣報告
氣溫:28.0@ 20:10
相對濕度:百分之 77%
天氣:大致多雲

沒有留言:

張貼留言