前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV 学习日记(二)---牛刀小试:输入输出图像和视频

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

作者头像
TeeyoHuang
发布2017-12-28 14:55:24
8310
发布2017-12-28 14:55:24
举报

于 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 )

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档