有時候,我們需要提取一個圖像的邊緣利於計算。
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; }
pos=0:
pos=50:
參考:http://blog.csdn.net/morewindows/article/details/8239625,學習opencv