OpenCV 学习日记(二)---牛刀小试:输入输出图像和视频

于 2016/6/15

Visual studio2010 + openCV 2.4.9

这一部分主要是举了几个简单的例子,以便大家对openCV有个初步的了解。声明一下,这几个例子,包括以后举得一些例子及其程序代码都是来自于:

清华大学出版社的《学习openCV》,Gary Bradski & Adrian Kaehler 著,于仕琪 刘瑞祯 译。

只做学习交流使用,不以牟利为目的。

一、显示图像

既然你已经在学习OpenCV了,那肯定知道它主要是用来干什么。所以我们最基础的一个例子,自然就是显示图像了。

#include<highgui.h>
int main(int argc, char** argv){
IplImage* img= cvLoadImage ("晓月.jpg");
cvNamedWindow("image1",CV_WINDOW_AUTOSIZE);
cvShowImage("image1",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("image1");
}

注意:图片 “晓月.jpg”我已经提前放到了有源程序cpp那个文件夹里面,

其实在源程序中也可以直接引用图片存放的路径,比如我还在其他位置放了一张 晓月.jpg,

我的路径为:D:\Documents\C_Language\视频和图片库,里面有张图片叫做 晓月.jpg

在往vs里面写的时候,要注意是这么写 IplImage* img= cvLoadImage ("D:/Documents/C_Language/视频和图片库/晓月.jpg");

!!!!!注意程序里那个斜线的倾斜方向哦!!!!直接copy路径是往左倾斜,但是要改成往右倾斜才正确。

程序的解释:

①cvLoadImage:很明显,load+image,字面意思就是载入图像,此函数返回一个指针值,如这里面定义的指针 img;

②IplImage:拆分看ipl + image,ipl是xx的缩写,所以他的意思也好理解。其实IplImage就是一类结构体的名称,是我们经常用到的数据结构。

③cvNamewindow:就是生成一个窗口,双引号中的内容就是这个窗口名字,可以试着把cvShowImage(“example1”,img)这一行注释掉,然后再看运行结果,你就会发现它确实只出现了一个窗口。这个东西就是由#include<highgui.h>引进来的。

然后是后面的CV_WINDOW_AUTOSIZE这句话,这个其实是定义了窗口的属性。Auto+size,字面意思就是自动大小,就是说这个窗口会适应图片的大小,图片有多大,窗口就有多大,感兴趣的可以拿大小不同的图片进行试验。一般设置为0,设置为0之后,窗口的大小不会自动适应图片大小,但是你此时可以进行拉伸,可以自己去试验。

④cvShowImage:不用多说

⑤cvWaiKey(0):等待你触发一个按键程序才结束

⑥cvReleaseImage、cvDestroyWindow都是释放类存的作用,简单的程序可以不用这两步。

注意:新手有几个常犯的错误,一定要区分开上面程序里的大小写,大小写不对是不能正确运行的,所以以后一定要区分开大小写!然后就是cvNamedWindow,注意是Name d  Window!中间有个d,漏掉这个当然就是错的。

上面几行程序其实是openCV1.x里面的了,时C语言的接口,一般在OpenCV2.x以上版本,都是下面这么显示图像,方便快捷,

#include<highgui.h>
#include<opencv2\core\core.hpp>
#include<opencv2\opencv.hpp>
using namespace cv;
int main(){
Mat img1 = imread("D:/Documents/C_Language/experiment1_showImage/experiment1_showImage/晓月.jpg");//注意这个斜线往右边倒
namedWindow("img1",0);
imshow("img1",img1);
cvWaitKey(0);
cvDestroyWindow("img1");
return 0;
}

这是基于C++接口的2.x版本都这么写,详细情况后面的文章会有介绍

二、播放AVI视频

#include<highgui.h>
#include<opencv.hpp>
int main( int argc, char ** argv){
cvNamedWindow("example",0);
CvCapture* capture= cvCreateFileCapture("D:/Documents/C_Language/Experiment2_playvideo/shipin.avi");
IplImage * frame;
while(1){
      frame = cvQueryFrame(capture);
      if ( !frame) break;
cvShowImage("example",frame);
char c= cvWaitKey(30);
if  (c==27) break;}
cvReleaseCapture(&capture);
cvDestroyWindow("example");

return 0;
}

视频结果就不显示了,下面是程序分析:

①cvCreateFileCapture,和cvLoadImage功能上类似,只不过这里是读入AVI文件,然后返回一个指针,返回指针所指向的Cvcapture结构被初始化到所对应文件的开头。

②frame =cvQueryFrame(capture);这句话其实就是把刚刚AVI视频,按照一帧一帧的图像的形式,复制给frame,然后再用cvShowImage显示出来,这里需要理解的就是,视频其实就是由很多帧图像构成的,联系一下电影和电影胶卷,你就明白了。

③char c=cvWaitKey(40)每帧之间停顿40ms,你可以之后随意更改此处的值,看看视频播放起来有什么区别。

④if  (c==27) break;播放期间如果你按了一按键,c就会被赋值为这个按键对应的ASCII码,而Esc的ASCII码是27,所以当你按了Esc之后,会退出播放界面。

常用的基于C接口的OpenCV1.x的六个函数(I/O)

 1. 图像载入函数

函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。函数支持bmp、jpg、 png、 tiff等格式的图像。其函数原型如下: IplImage* cvLoadImage( const char* filename, int iscolor); 其中,filename 是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。

 2. 窗口定义函数 函数

cvNamedWindow定义一个窗口,用于显示图像。其函数原型如下: int cvNamedWindow( const char* name, unsigned long flags ); 其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。

3. 图像显示函数 函数cvShowImage

是在指定的窗口中显示图像,其函数原型如下: void cvShowImage( const char* name, const CvArr* image ); 其中,name是窗口名称,image是图像类型指针,一般是IplImage指针。

 4. 图像保存函数 函数cvSaveImage

以指定的文件名保存IplImage类型的指针变量,其函数原型如下: int cvSaveImage( const char*filename, const CvArr* image ); 其中,filename是图像保存路径和名称,image是IplImage指针变量。

 5. 图像销毁函数 函数cvReleaseImage

销毁已定义的IplImage指针变量,释放占用内存空间。其函数原型如下: void cvReleaseImage(IplImage** image ); 其中,image为已定义的IplImage指针。

6. 图像转换函数 cvGetImage( const CvArr* arr, IplImage* image_header )

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博客

Win8 连连看 第二季(1)

思路如下:暂定游戏中图标有100个(10行10列),对每个小图标用用户控件进行展示(好处很多方便绑定数据,链接事件,实现动画效果等)。

562
来自专栏阿凯的Excel

或关系模糊匹配求均值(虐心升级版)

上期和大家分享了如何使用数组函数实现或关系求均值。 本期和大家分享进一步的应用,或关系模糊匹配求均值。 如果没看上期直接看本期会比较痛苦,来个传送门! 点击我可...

2596
来自专栏我是极客人

图片去霾算法实践】NDK下二维数组的传递

最近看到了一篇关于图片“去霾算法”的文章,一下子就有了兴趣,所以想着能不能实现。由于数学能力捉急,无法理解文章的思想和相关论文。于是在Github上找到了相关的...

653
来自专栏北京马哥教育

Python有趣的小案例

2324
来自专栏Python数据科学

Seaborn从零开始学习教程(二)

在Seaborn的使用中,是可以针对数据类型而选择合适的颜色,并且使用选择的颜色进行可视化,节省了大量的可视化的颜色调整工作。

932
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十八)

但是有一种情况是递归时不断调用自身,达到不了最简单的情况(例如俄罗斯套娃一层层打开到最内层的),所以一直找不到递归的出口。

843
来自专栏AndroidTv

封装个 Android 的高斯模糊组件基础理论二次封装

最近基于 Android StackBlur 开源库,根据自己碰到的需求场景,封装了个高斯模糊组件,顺便记录一下。

493
来自专栏Android点滴积累

Android高效内存之让你的图片省内存

Android高效内存之让你的图片省内存        在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用。而在App中,大...

19711
来自专栏wym

2018年湘潭大学程序设计竞赛 F题题解

小明来到一个由n x m个格子组成的迷宫,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱。小明所在的位置用'S'表示,目的地用'T'表示...

452
来自专栏落影的专栏

基于视锥体(平截体)的OpenGL ES性能优化

教程 OpenGLES入门教程1-Tutorial01-GLKit OpenGLES入门教程2-Tutorial02-shader入门 OpenGLES入门...

2787

扫码关注云+社区