//从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #include <cv.h> #include <highgui.h> #include<stdarg.h> #include <iostream> void showThreeImage(char *title,int num,...){ //声明变量 IplImage *img; IplImage *dispImg; int i,m,n; //创建image,大小960*300,8位无符号,3通道 dispImg = cvCreateImage(cvSize(960, 300), 8, 3); va_list args;//【定义不定参数列表args】 va_start(args,num);//【获得第一个可变参数地址】 for(i=0,m=20,n=20;i<num;i++,m+=320){ img = va_arg(args,IplImage*);//【读取一个IplImage类型的,args指向下一个】 if(img==0){ printf("Invalid arguments"); cvReleaseImage(&dispImg); return; } //设置感兴趣区域,随着for的循环,感兴趣区域不断右移 cvSetImageROI(dispImg,cvRect(m,n,300, 300)); //释放指针,为下一幅图的指向做准备 cvResize(img,dispImg); //释放感兴趣区域,为下一次做准备 cvResetImageROI(dispImg); } cvShowImage(title,dispImg); va_end(args);//【结束解析】 cvReleaseImage(&dispImg); } int main(int argc, char *argv[]){ CvCapture* capture=cvCreateFileCapture("E:\Videos\xx.avi");//让capture变量指向视频文件 if(!capture) return -1;//检查函数是否成功 cvNamedWindow("video",1);//声明窗口 cvResizeWindow("video",960,300); //cvNamedWindow("video1",1); while(1){ //变量初始化 IplImage *vd_frame = cvQueryFrame(capture); IplImage *gray_frame = cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,1); IplImage *canny_frame = cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,1); //和vd_frame一样的通道 IplImage *frame1=cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,vd_frame->nChannels); IplImage *frame2=cvCreateImage(cvGetSize(vd_frame),vd_frame->depth,vd_frame->nChannels); //image转换 cvConvertImage(vd_frame,gray_frame,0);//flag=1则会得到倒立的图像 cvCanny(vd_frame,canny_frame,10,50,3);//阈值一,小一点可以扣更多边缘。。阈值二越大扣的越少,3通道 //cvShowImage("video1",canny_frame); //颜色转换 cvCvtColor(gray_frame,frame1,CV_GRAY2RGB);//BGR或RGB都行 cvCvtColor(canny_frame,frame2,CV_GRAY2RGB); //函数调用 //cvShowImage("video1",frame1); showThreeImage("video",3,vd_frame,frame1,frame2); char c=cvWaitKey(28); if(c==27) break; //释放空间 cvReleaseImage(&gray_frame); cvReleaseImage(&canny_frame); cvReleaseImage(&frame1); cvReleaseImage(&frame2); } cvReleaseCapture(&capture); cvDestroyAllWindows(); return 0; }