于 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 )
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有