直接贴代码,解释都在注释里,全部可以运行。
#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指针为null cvReleaseImage(&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帧/S char 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_HEIGTH int 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帧/S char 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指针为null cvReleaseImage(&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; }
学习OpenCV 第二章示例
最新推荐文章于 2024-09-11 02:01:15 发布