学习OpenCV  第二章示例

来源:互联网 发布:怎么开通淘宝客 编辑:程序博客网 时间:2024/04/29 04:43
直接贴代码,解释都在注释里,全部可以运行。

#include <cv.h>#include <highgui.h>#include<stdlib.h>#include<stdio.h>// 初始化int g_slider_postion = 0;CvCapture* g_capture = NULL;// 声明函数int showAVI(int argc);int showImage();void showTrackableAVI();void SmoothOut();IplImage* doPyrDown(IplImage* in,int filter);IplImage* doCanny( IplImage* in,double lowThresh,double highThresh,double apetrue);void doWriteAVI();int main(int argc, char* argv[]){//SmoothOut();//showTrackableAVI();//showImage();//showAVI(argc);doWriteAVI();puts("结束了");return 0;}int showImage(){puts("任务:显示图像,执行缩放,执行边缘检测");const char* filename = "d:\\4.jpg" ;//换成你自己的文件路径名!!请注意,双斜杠!!  const char* wndname = "ShowImage" ;  //cvLoadImage 读入图片后,返回一个指向该图像的数据结构的指针IplImage* pImage = cvLoadImage(filename,0) ; IplImage* out;// 显示一个窗口,参数1 为 窗口名称,参数2 为 窗口大小设置,是自动扩大,还是自动伸缩cvNamedWindow(wndname,CV_WINDOW_AUTOSIZE);  //显示图片,参数1 为 要显示到窗口名称,参数2 为 指向图片的数据结构内存地址的指针cvShowImage(wndname,pImage); cvNamedWindow("PyrDown",CV_WINDOW_AUTOSIZE);out = doPyrDown(pImage,IPL_GAUSSIAN_5x5);cvShowImage("PyrDown",out);  cvNamedWindow("CannyDetect",CV_WINDOW_AUTOSIZE);out = doCanny(pImage,10,100,3);cvShowImage("CannyDetect",out);// 使程序暂停,等待用户触发一个操作,参数为正表示等待的ms时长,为0 或 负表示将一直等待用户的按键操作cvWaitKey(0);  // 释放为该图像文件指定的内存,pImage指针为nullcvReleaseImage(&pImage);cvReleaseImage(&out);//销毁窗口并释放为改窗口分配的所有内存cvDestroyAllWindows();return 0;}int showAVI(int argc){// 首先创建一个窗口,名字叫Example2 大小自由比率cvNamedWindow("showAVI",CV_WINDOW_KEEPRATIO);// 通过参数设置确定要读入的文件,然后返回一个指向CvCapture 结构的指针,capture结构指针被指向AVI文件的开头CvCapture* capture ;if(argc == 1 ) capture = cvCreateCameraCapture(0);elsecapture = cvCreateFileCapture("c:\\Users\\iSky\\Desktop\\filghtless bird.avi");assert(capture !=NULL);IplImage* frame ;while(1){//用来将下一帧视频文件填充到CvCapture指针frame = cvQueryFrame(capture);if( !frame)break;//显示每一帧//IplImage* frame1 = doCanny(frame,30,100,3); 由于输入的图像不是灰度图像,所以不会执行cvShowImage("showAVI",frame);//控制每一帧的切换时间,即帧速率30帧/Schar c = cvWaitKey(33);//如果按键为ESC(ASCII 为 27) 则退出if( c == 27) break;}// 释放 CVCapture结构开辟的内存空间cvReleaseCapture(&capture);cvDestroyWindow("showAVI");return 0;}void onTrackbarSlide(int pos){cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);}void showTrackableAVI(){// 首先创建一个窗口,名字叫Example2 大小自由比率cvNamedWindow("Example3",CV_WINDOW_KEEPRATIO);// 通过参数设置确定要读入的文件,然后返回一个指向CvCapture 结构的指针,capture结构指针被指向AVI文件的开头g_capture  = cvCreateFileCapture("c:\\Users\\iSky\\Desktop\\filghtless bird.avi");//cvGetCaptureProperty(pram1,pram2) 让用户获得CvCapture 的属性信息,//参数1为要获得属性的CvCapture ,参数2为属性字段//可以是帧的总数:CV_CAP_PROP_FRAME_COUNT//可以是帧的宽度:CV_CAP_PROP_FRAME_WIDTH//可以是帧的高度:CV_CAP_PROP_FRAME_HEIGTHint frames = (int) cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);if(frames  != 0){cvCreateTrackbar("Postion","Example3",&g_slider_postion,frames,onTrackbarSlide);}IplImage* frame ;while(1){// 用来将下一帧视频文件填充到IplImage指针frame = cvQueryFrame(g_capture);if( !frame)break;// 显示每一帧cvShowImage("Example3",frame);// 控制每一帧的切换时间,即帧速率30帧/Schar c = cvWaitKey(33);//如果按键为ESC(ASCII 为 27) 则退出if( c == 65) {onTrackbarSlide(20);}else if ( c == 27){break;}}// 释放 CVCapture结构开辟的内存空间cvReleaseCapture(&g_capture);cvDestroyWindow("Example3");return ;}void SmoothOut(){const char* filename = "d:\\5.jpg" ;//换成你自己的文件路径名!!请注意,双斜杠!!  const char* wndname1 = "Smooth_In" ;  const char* wndname2 = "Smooth_Out";cvNamedWindow(wndname1,CV_WINDOW_FREERATIO);cvNamedWindow(wndname2,CV_WINDOW_FREERATIO);//cvLoadImage 读入图片后,返回一个指向该图像的数据结构的指针IplImage* pImage = cvLoadImage(filename,-1) ; cvShowImage(wndname1,pImage);// 这里一定要注意,如果输入的pImage 不是三通道的,那么将会导致Exception// 比如这里我们在上面cvLoadImage的第二个参数,如果我们设为0 ,那么将为单通道的灰度图像,这里再使用3通道就将出错IplImage* out = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,3);cvSmooth(pImage,out,CV_GAUSSIAN,3,0,0,0);cvWaitKey(3);cvShowImage(wndname2,out);  // 使程序暂停,等待用户触发一个操作,参数为正表示等待的ms时长,为0 或 负表示将一直等待用户的按键操作cvWaitKey(0);  // 释放为该图像文件指定的内存,pImage指针为nullcvReleaseImage(&out);cvReleaseImage(&pImage);//销毁窗口并释放为改窗口分配的所有内存cvDestroyAllWindows();}//对原图使用PyrDown(src,des)缩放IplImage* doPyrDown(IplImage* in,int filter){assert( in->width % 2 == 0 && in->height % 2 ==0);IplImage* out = cvCreateImage(cvSize( in->width/2,in->height/2),in->depth,in->nChannels);//按照源图像大小进行缩放,缩放后的图像存于out 中,包含了输出图像的内存分配cvPyrDown(in,out,filter);return out;}IplImage* doCanny( IplImage* in,double lowThresh,double highThresh,double apetrue){// canny 只处理单通道的灰度级的图像,if(in->nChannels != 1)return (0);puts("execute canny");IplImage* out = cvCreateImage(cvGetSize(in),IPL_DEPTH_8U,1);cvCanny(in,out,lowThresh,highThresh,apetrue);return (out);}//     读入视频,并使用极坐标将其转换为人眼所看到的图像,灰度没有实现。void doWriteAVI(){//打开视频CvCapture* capture = cvCreateFileCapture("c:\\Users\\iSky\\Desktop\\filghtless bird.avi");// 指针的键为地址,其指向的内容为值,其实就是一个键值对if(!capture)return;// 读入视频IplImage* bg_frame = cvQueryFrame(capture);// 通过getcaptureproperty来获得视频信息,帧速率double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);// 获得帧的大小CvSize size = cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT));//获得视频写指针,cvCreatVideoWriter()四个参数//1.为视频源文件//2.指定编码格式,四个字符构成了编解码器的“4字标记”,//3.帧速率//4.视频图像大小CvVideoWriter* writer = cvCreateVideoWriter("c:\\Users\\iSky\\Desktop\\grey filghtless bird.avi",CV_FOURCC('M','J','J','G'),fps,size);//    IplImage* logpolar_frame = cvCreateImage(size,IPL_DEPTH_8U,3);//2D point with floating-point coordinates.  二维坐标点,值为单精度浮点数const CvPoint2D32f points = cvPoint2D32f(bg_frame->width/2,bg_frame->height/2);while((bg_frame=cvQueryFrame(capture))!=NULL){//src 输入图像,dst 输出图像,center 变换的中心, M 幅度的尺度参数,flags 插值方法//之所以转换为极坐标,是将其转换为人眼看到的//以图像中心位原点,缩放比例40,双线性插值,cvLogPolar(bg_frame,logpolar_frame,points,40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS);cvWriteFrame(writer,logpolar_frame);}cvReleaseVideoWriter(&writer);cvReleaseImage(&logpolar_frame);cvReleaseCapture(&capture);return;}

原创粉丝点击