00 Canny邊緣檢測

Post date: 2012/4/10 上午 08:22:34

C語言版本

來自于仕琪的講稿《使用OpenCV進行圖像處理》中的常式

/************************************************** * cvCanny:Canny邊緣檢測 **************************************************/ /*********************************************************************** * OpenCV example * By Shiqi Yu 2006 ***********************************************************************/ #include "cv.h" #include "cxcore.h" #include "highgui.h" int main( int argc, char** argv ) { //聲明IplImage指針 IplImage* pImg = NULL; IplImage* pCannyImg = NULL; //載入圖像,強制轉化為Gray if( argc == 2 && (pImg = cvLoadImage( argv[1], 0)) != 0 ) { //為canny邊緣圖像申請空間 pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1); //canny邊緣檢測 cvCanny(pImg, pCannyImg, 50, 150, 3); //創建視窗 cvNamedWindow("src", 1); cvNamedWindow("canny",1); //顯示圖像 cvShowImage( "src", pImg ); cvShowImage( "canny", pCannyImg ); cvWaitKey(0); //等待按鍵 //銷毀視窗 cvDestroyWindow( "src" ); cvDestroyWindow( "canny" ); //釋放圖像 cvReleaseImage( &pImg ); cvReleaseImage( &pCannyImg ); return 0; } return -1; }

Insertformulahere=函數說明= 請參見 Cv圖像處理#Canny

C++語言版本

/************************************************** * C++ Canny:Canny邊緣檢測 **************************************************/ /*********************************************************************** * OpenCV example * By Min Qi February 26, 2012, Indianapolis, IN ***********************************************************************/ #include "cv.hpp" #include "cxcore.hpp" #include "opencv2\highgui\highgui.hpp" using namespace cv; using namespace std; int edgeThresh = 1; // 聲明 原始圖片,灰度圖片,和 canny邊緣圖片 Mat image, cedge; Mat gray, edge; void onTrackbar(int, void*) { //blur 灰度圖片 blur(gray, edge, Size(3,3)); // Canny 邊緣檢測 Canny(gray,edge, edgeThresh, edgeThresh*3, 3); //全部設為0 cedge = Scalar::all(0); //拷貝邊緣的象素點 image.copyTo(cedge, edge); imshow("Edge map", edge); } int main(int argc, char** argv) { // 載入圖片 image = imread(argv[1], 1); // 判斷載入圖片是否成功 if(image.empty()) { printf("miss the image file: %d \n", argv[1]); return -1; } // 生成灰度圖片,因為只有灰度圖片才能生成邊緣圖片 cedge.create(image.size(), image.type()); cvtColor(image,gray, CV_BGR2GRAY); //新建一個視窗 namedWindow("Edge map", 1); // 生成一個進度條來控制邊緣檢測 createTrackbar("Canny Threshold", "Edge map", &edgeThresh, 100, onTrackbar); //初始化圖像 onTrackbar(0,0); waitKey(0); return 0; }}

Python版本

# -*- coding:utf-8 -*- ########################################################### # OpenCV example # # cvCanny:Canny邊緣檢測 # # By ChaiShushan 2008 ########################################################### import sys # 導入OpenCV模塊 from opencv.cv import * from opencv.highgui import * if __name__ == '__main__': if len(sys.argv) == 2: # 載入圖像,強制轉化為Gray # 0表示Gray,1表示Origin,因為cvCanny函數參數要求圖像必須是單通道的 pImg = cvLoadImage(sys.argv[1], 0) if not pImg: sys.exit(-1) # 為canny邊緣圖像申請空間 pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1) # canny邊緣檢測 # 50和150是檢測閥值,opencv必須手工輸入閥值,如需自動匹配閥值參考cvCanny函數介紹 cvCanny(pImg, pCannyImg, 50, 150, 3) # 創建視窗 cvNamedWindow("src", 1) cvNamedWindow("canny",1) # 顯示圖像 cvShowImage( "src", pImg ) cvShowImage( "canny", pCannyImg ) # 等待按鍵 cvWaitKey(0); # 銷毀視窗 cvDestroyWindow( "src" ) cvDestroyWindow( "canny" ) # 釋放圖像 cvReleaseImage( pImg ) cvReleaseImage( pCannyImg ) sys.exit(0)

註: Python版本由chai2010改寫.

Python2.7-OpenCV2.2版本

''' Created on 2011-8-17 @author: Sunny ''' # -*- coding:utf-8 -*- # 導入OpenCV模塊 import cv import sys if __name__ == '__main__': # 載入圖像,強制轉換成Gray # 表示Gray,1表示Origin,因為cv.Canny函數要求圖像必須是單通道的 Img1 = cv.LoadImage("Lena.jpg",0) # 創建一個canny圖像 PCannyImg = cv.CreateImage(cv.GetSize(Img1), cv.IPL_DEPTH_8U, 1) # canny邊緣檢測 # 50和150是檢測閾值,opencv必須手工輸入閾值,如需自動匹配閾值,請參考cvCanny介紹 cv.Canny(Img1, PCannyImg, 50, 150, 3) # 創建視窗 cv.NamedWindow("src", 1) cv.NamedWindow("canny", 1) # 顯示視窗 cv.ShowImage("src", Img1) cv.ShowImage("canny", PCannyImg) # 等待按鍵 cv.WaitKey(0) # OpenCV2.2的Python介面沒有Release函數,所以直接銷毀視窗 cv.DestroyWindow("src") cv.DestroyWindow("canny") sys.exit(0)

註: Python2.7-OpenCV2.2版本由sunny2020改寫.