我们先来看一段关于边缘检测的代码:
//边缘检测 canny算子 #include"cv.h" #include"highgui.h" #include<iostream> using namespace std; char wndname[] = "Edge"; char tbarname[] = "Threshold"; int edge_thresh = 1; IplImage * image = 0,* cedge = 0,*gray = 0,* edge=0; //读取图像 //定义跟踪条的callback函数 void on_trackbar(int h) { cvSmooth(gray,edge,CV_BLUR,3,3,0); cvNot(gray,edge); //灰度图的边缘检测 cvCanny(gray,edge,(float)edge_thresh,(float)edge_thresh*3,3); cvZero(cedge); cvCopy(image,cedge,edge); //显示图像 cvShowImage(wndname,cedge); } int main(int argc,char **argv) { char *filename = argc == 2?argv[1]:(char *) "fruits.jpg"; if((image=cvLoadImage(filename,1))==0) //flag=1>0为三通道彩色图 return -1; cedge = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,3); //彩色图像转换为灰度图像 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); cvNamedWindow(wndname,1); cvCreateTrackbar(tbarname,wndname,&edge_thresh,100,on_trackbar); on_trackbar(0); int pos = cvGetTrackbarPos("tbarname","wndname"); cout<<pos<<endl; cvWaitKey(0); cvReleaseImage(&image); cvReleaseImage(&gray); cvReleaseImage(&edge); cvDestroyWindow(wndname); return 0; }可以看到canny算子的简单运用在opencv中也涉及到很多函数,这里在读代码的同时对opencv中用到的函数进行讲解:
窗口管理:
输入处理:(拖动条事件的处理,鼠标时间的处理)
分配和释放图像函数:
IplImage *cvCreateImage(CvSize size,int depth,int channels)size可以通过函数cvSize(width,height)得到。
设置得到感兴趣的区域:
文件中图像的读写:
访问图像元素:
图像转换:
(绘制图像命令可以不用深究)
离散变换:(一维或者二维浮点数组的离散傅立叶变换或离散傅立叶逆变换)