//从视频文件中读入数据-->将数据转换为灰度图-->对图像做candy边缘检测 //作者:sandy //时间:2015-10-10 #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]){ //预备工作 CvCapture* capture=cvCreateFileCapture("E:\Videos\xx.avi");//让capture变量指向视频文件 if(!capture) return -1;//检查函数是否成功 //读视频 //方法一:用cvGrab(攫取)Frame()将视频复制到内存空间, //再用cvRetrieve(检索)Frame()来处理读入的数据 //方法二:用cvQueryFrame()来代替方法一种的两个函数 //申明变量 IplImage *vd_frame;//用来存放彩色的视频 IplImage *gray_frame;//用来存放灰度图 IplImage *canny_frame;//canny边缘检测后的图 //声明窗口 cvNamedWindow("video",0); cvNamedWindow("gray",0); cvNamedWindow("canny",0); //变量初始化 vd_frame = cvQueryFrame(capture); gray_frame = cvCreateImage(cvGetSize(vd_frame),IPL_DEPTH_8U,1); canny_frame = cvCreateImage(cvGetSize(vd_frame),IPL_DEPTH_8U,1); while(1){ //不同图像格式的转换函数cvConvertImage(const CvArr* src(源),CvArr dst(目标), int flag=0) //canny边缘检测函数cvCanny(const CvArr * image,CvArr *edges,double 阈值一,double 阈值二,int 算子内核大小) //小阈值用来控制边缘链接,大阈值用来控制边缘的初始分割。 cvConvertImage(vd_frame,gray_frame,0);//flag=1则会得到倒立的图像 cvCanny(vd_frame,canny_frame,10,50,3);//阈值一,小一点可以扣更多边缘。。阈值二越大扣的越少 //显示 cvShowImage("video",vd_frame); cvShowImage("gray",gray_frame); cvShowImage("canny",canny_frame); char c=cvWaitKey(28); if(c==27) break; vd_frame = cvQueryFrame(capture); } //查询和设置视频的各种属性 //释放CvCapture结构 cvReleaseCapture(&capture); cvDestroyAllWindows(); return 0; }