Canny邊緣檢測
圖像的邊緣檢測的原理是檢測出圖像中所有灰度值變化較大的點,而且這些點連接起來就構成了若干線條,這些線條就可以稱為圖像的邊緣
函數原型:
void cvCanny(
const CvArr* image, //第一個參數表示輸入圖像,必須為單通道灰度圖
CvArr* edges, //第二個參數表示輸出的邊緣圖像,為單通道黑白圖
double threshold1,
double threshold2, //第三個參數和第四個參數表示閾值,這二個閾值中當中的小閾值用來控制邊緣連接,
大的閾值用來控制強邊緣的初始分割即如果一個像素的梯度大與上限值,則被認為
是邊緣像素,如果小於下限閾值,則被拋棄。如果該點的梯度在兩者之間則當這個
點與高於上限值的像素點連接時我們才保留,否則刪除。
int aperture_size=3 //第五個參數表示Sobel 算子大小,默認為3即表示一個3*3的矩陣。Sobel 算子與
高斯拉普拉斯算子都是常用的邊緣算子
);
函數功能:創建trackbar並添加到指定窗口
函數原型:
intcvCreateTrackbar(
const char* trackbar_name, //第一個參數表示該trackbar的名稱。
const char* window_name, //第二個參數表示窗口名稱,該trackbar將顯示在這個窗口內。
int* value, //第三個參數表示創建時滑塊的位置。
int count, //第四個參數表示滑塊位置的最大值,最小值固定為0。
CvTrackbarCallback on_change //第五個參數表示回調函數。當滑塊位置有變化時,系統會調用該回調函數。
);
注:被創建的trackbar默認顯示在指定窗口的頂端,可以通過函數cvGetTrackbarPos()來獲取
trackbar顯示的位置信息,以及通過函數cvSetTrackbarPos()來重新設置trackbar的顯示位置。
<CvTrackbarCallback>
函數功能:cvCreateTrackbar()函數所使用的回調函數
函數定義:
typedef void (CV_CDECL *CvTrackbarCallback)(int pos)
函數說明:
當trackbar位置被改變的時,系統會調用這個回調函數,並將參數pos設置為表示trackbar位置的數值。
#include "stdafx.h" #include "iostream" using namespace std; #include "opencv2/opencv.hpp" IplImage *pGrayImage = NULL; IplImage *pCannyImage = NULL; const char *pImagePath = "E:/C_VC_code/Text_Photo/girl001.jpg"; const char *pGrayWindowsTitle = "原圖"; const char *pCannyWindowsTitle = "邊緣檢測圖"; const char *pWindowsToolBarTitle = "閥值"; void onCallBack(int pos) { //Canny check cvCanny(pGrayImage, pCannyImage, pos, pos*3, 3); cvShowImage(pCannyWindowsTitle, pCannyImage); } int main() { //load gray image from srcouce file image pGrayImage = cvLoadImage(pImagePath, CV_LOAD_IMAGE_GRAYSCALE); pCannyImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U,1); //create window cvNamedWindow(pGrayWindowsTitle,CV_WINDOW_AUTOSIZE); cvNamedWindow(pCannyWindowsTitle,CV_WINDOW_AUTOSIZE); //creat slide bar int pos = 1; cvCreateTrackbar(pWindowsToolBarTitle, pCannyWindowsTitle, &pos, 100,onCallBack); onCallBack(0); cvShowImage(pGrayWindowsTitle,pGrayImage); cvShowImage(pCannyWindowsTitle,pCannyImage); cvWaitKey(0); cvDestroyWindow(pCannyWindowsTitle); cvDestroyWindow(pGrayWindowsTitle); cvReleaseImage(&pGrayImage); cvReleaseImage(&pCannyImage); return 0; }

