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

相关文章

来自专栏Java架构沉思录

什么是一致性哈希算法

原文:http://www.cnblogs.com/hapjin/p/4737207.html

1121
来自专栏owent

POJ PKU 1986 Distance Queries 解题报告

题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1986

742
来自专栏逍遥剑客的游戏开发

Nebula3绘制2D纹理

1526
来自专栏Fish

CCF 最优灌溉

问题描述   雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉。   为了灌溉,雷雷需要建立一些...

2117
来自专栏前端菜鸟变老鸟

判断两个json是不是相等的

933
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java案例】余弦函数

案例描述 在屏幕上画出余弦函数cos(x)曲线,如图1.6所示。 ? 图1.6 余弦函数cos(x)曲线 案例分析 连续的曲线是由点组成的,点与点之间距离比较...

4416
来自专栏数值分析与有限元编程

可视化 | 一个三角形常应变单元后处理例子

昨天提到了应力云图,其实质是用不同的颜色填充等值线。有了结点的应力值,单元内任意一点的应力值是通过插值实现的。下面来看一个悬臂梁的综合后处理。 如图所示,一个悬...

2707
来自专栏ascii0x03的安全笔记

【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题

关于bmp图片的格式,网上有很多文章,具体可以参考百度百科,也有例子程序。这里只提要注意的问题。 (1)结构体定义问题:首先按照百度百科介绍的定义了结构体,但是...

6116
来自专栏图像识别与深度学习

2018-06-30 详解 MNIST 数据集

1192
来自专栏极客猴

Django 学习笔记之模型高级用法(下)

除了抽象模型,在模型中定义的字段都会成为表中的列。如果我们需要给模型指定其他一些信息,例如排序方式、数据库表名等,就需要用到 Meta。Meta 是一个可选的类...

892

扫码关注云+社区