Canny邊緣檢測


  有時候,我們需要提取一個圖像的邊緣利於計算。

  opencv實現了Canny邊緣檢測的函數,方便調用。Canny算子的原理是首先在x,y方向求一階導數,然后組合為4個方向的導數。這些方向的導數達到局部最大值的點就是組成邊緣的候選點。

  1.1cvCanny函數:

CVAPI(void)  cvCanny( const CvArr* image, CvArr* edges, double threshold1,
                      double threshold2, int  aperture_size CV_DEFAULT(3) );

  第一個參數:輸入:是灰度圖,就算是彩色圖也會處理成灰度圖

  第二個參數:輸出的圖的位置,輸出的圖式二值圖

  第三第四個參數:是兩個閾值,上限與下限,如果一個像素的梯度大於上限,則被認為是邊緣像素,如果低於下限則被拋棄,如果介於兩者之間,只有當其與高於上限閾值的像素連接時才會被接受。

  第五個參數:表示模板的大小,如果是3,則表示3*3矩陣的大小

  

  有時候在圖像變化的時候需要實時的變化閾值,則可以用滑動條來處理。

  1.2 cvCreateTrackbar

CVAPI(int) cvCreateTrackbar( const char* trackbar_name, const char* window_name,
                             int* value, int count, CvTrackbarCallback on_change CV_DEFAULT(NULL));

  函數說明:

  第一個參數表示該trackbar的名稱。

  第二個參數表示窗口名稱,該trackbar將顯示在這個窗口內。

  第三個參數表示創建時滑塊的位置。

  第四個參數表示滑塊位置的最大值,最小值固定為0。

  第五個參數表示回調函數。當滑塊位置有變化時,系統會調用該回調函數。

  

  1.3 配合使用的回調函數

typedef void (CV_CDECL *CvTrackbarCallback)(int pos);

  當trackbar位置被改變的時,系統會調用這個回調函數,並將參數pos設置為表示trackbar位置的數值

 

演示程序:

  

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

IplImage *g_pSrcImage, *g_pCannyImg;
const char *pstrWindowsCannyTitle = "邊緣檢測圖";
//cvCreateTrackbar的回調函數
void on_trackbar(int threshold)
{
    //canny邊緣檢測
    cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3);
    cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);
}
int main()
{
    const char *pstrImageName = "C:/from.bmp";
    const char *pstrWindowsSrcTitle = "原圖";
    const char *pstrWindowsToolBar = "滑動條";

    //從文件中載入圖像的灰度圖CV_LOAD_IMAGE_GRAYSCALE - 灰度圖
    g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
    g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1);

    //創建窗口
    cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
    cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE);

//創建滑動條
    int nThresholdEdge = 1;
    cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 200, on_trackbar);

    //在指定窗口中顯示圖像
    cvShowImage(pstrWindowsSrcTitle, g_pSrcImage);
    on_trackbar(1);

    //等待按鍵事件
    cvWaitKey();

    cvDestroyWindow(pstrWindowsSrcTitle);
    cvDestroyWindow(pstrWindowsCannyTitle);
    cvReleaseImage(&g_pSrcImage);
    cvReleaseImage(&g_pCannyImg);
    return 0;
}
View Code

  

  pos=0:

  

  pos=50:

  

 

  參考:http://blog.csdn.net/morewindows/article/details/8239625,學習opencv


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM