边缘检测——OpenCV例子学习 |
下面是OpenCV中的一个例子edge.c,我加了一些注释,以便自己理解。 /*-- edge.c --*/ #ifdef _CH_ #pragma package #endif #ifndef _EiC #include "cv.h" #include "highgui.h" #endif char wndname[] = "Edge"; char tbarname[] = "Threshold"; int edge_thresh = 1; IplImage *image = 0, *cedge = 0, *gray = 0, *edge = 0; // define a trackbar callback void on_trackbar(int h) { cvSmooth( gray, edge, CV_BLUR, 3, 3, 0, 0 );//滤波函数,在这里貌似不起作用,因为产生的结果被下面的函数产生的结果覆盖 cvNot( gray, edge );//按位取反函数,在这里貌似不起作用,因为产生的结果被下面的函数产生的结果覆盖 // Run the edge detector on grayscale cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 3);//边缘检测 cvZero( cedge );//清空数组 // copy edge points cvCopy( image, cedge, edge );//从image中复制edge指定的内容到cedge cvShowImage(wndname, cedge);//显示cedge } int main( int argc, char** argv ) { if( (image = cvLoadImage( filename, 1)) == 0 ) return -1; // Create the output image,8位无符号深度,3通道 cedge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3); // Convert to grayscale,8位无符号深度,1通道 gray = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1); edge = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 1); cvCvtColor(image, gray, CV_BGR2GRAY);//把image转换成黑白放到gray中 // Create a window cvNamedWindow(wndname, 1); // create a toolbar cvCreateTrackbar(tbarname, wndname, &edge_thresh, 100, on_trackbar);//创建游标 // Show the image on_trackbar(0); // Wait for a key stroke; the same function arranges events processing cvWaitKey(0); cvReleaseImage(&image); cvReleaseImage(&gray); cvReleaseImage(&edge); cvDestroyWindow(wndname); return 0; } #ifdef _EiC main(1,"edge.c"); #endif 编译文件后运行 然后滑动游标,就可以得到满意的中的图像的边缘检测结果 |