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 条评论
登录 后参与评论

相关文章

来自专栏杨龙飞前端

scrollto 到指定位置

2494
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2142
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2702
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2707
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4064
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2526
来自专栏码匠的流水账

聊聊NettyConnector的start及shutdown

reactor-netty-0.7.6.RELEASE-sources.jar!/reactor/ipc/netty/NettyConnector.java

851
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3859
来自专栏张善友的专栏

Mix 10 上的asp.net mvc 2的相关Session

Beyond File | New Company: From Cheesy Sample to Social Platform Scott Hansel...

2547
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4848

扫码关注云+社区