OpenCV程序设计介绍(1)

OpenCV(Open Source Computer Vision)
由Intel公司所开发出来的Open Source图像算法的函数库(Image Process Libary)可以制做图片,视频,矩阵运算,统计,图论,数据存储的相关C语言程序设计,相关的领域为:图像处理,机器视觉,图像识别,计算机图形学,信息检索或游戏设计,比较有名的示例为物体追踪,人脸辨识,傅立叶转换,纹理分析,可以整合不同图像文件格式的矩阵运算,应用在静态图片 (BMP,JPG,TIF,PNG),动态Webcam的影像处理.

OpenCV的组成为许多图像处理的数据结构及算法,因此需要一些基本的数据结构基础,比如说struct怎么使用,如何release数据结构的空间等基本操作,会使用到linked list的算少数,算是C语言中级程序设计,有兴趣玩的话,国内图像处理领域相关论文算法几乎都可以在OpenCV找的到,方便学术界用c语言推演更高级的图像处理处理算法,功能好比Matlab,但比Matlab快上许多倍,更可以整合c语言相关函数库,做更多元强大的功能应用,然而它最大的门槛是比 Matlab的进入障碍还高一些,运用到许多数据结构,指标运算,內存位址,学完OpenCV,相信程序设计的功力更可以技高一筹.

OpenCV 提供了简单的GUI接口,他无法像MicroSoft Visual C++的MFC及Borland C++builder的VCL那么完整,但如果是对于学术领域的研究是够用的,他也可以整合在Visual C++及C++ builder的环境上,而本人是以Dev - C++为主,属于最基本简单又不须付费的Complier.

接下来进入OpenCV最基础的入门,OpenCV最常用的函数库为"cv.h","highgui.h","cxcore.h"及"cvaux.h.h","cv.h"代表 Computer Vision,计算机视觉函数库,"highgui.h",当然就是GUI接口的函数库啦,当路径都配置好之后(第一篇安装方法),直接在开头 include进去就好啦,就跟stdio.h的使用方法一样

#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <cvaux.h>


接着,就介绍最基本的数据结构,IplImage,此数据结构是所有图像文件的一个中介,图像格式有很多种(bmp,jpg,png,tif),此数据结构的内容既不是bmp,也不是jpg,而是一个由cvLoadImage()所转换的自定义格式,如下所示:



读入图片之后,要怎么知道图片真的读入了呢,就利用"highgui.h"的功能来看看吧.

 

 

cvNamedWindow("Show Image",0);
cvResizeWindow("Show Image",300,400);
cvShowImage("Show Image",Image1);

 

要使用OpenCV的GUI时,要先给窗口名称命名,这算是比较好写的GUI之一了,里面"Show Image"就是这个窗口的名称,cvResizeWindow()就是调整窗口大小,窗口大小被配置在300*400,并指定窗口的名称,再来,就是显 示窗口的图片cvShowImage(),并且给予IplImage数据结构的结构变量,Image1里面必须要先用cvLoadImage()存入图像文件,接着,再用键盘事件cvWaitKey(0)来做等待延迟,一张图片就可以被打开啦,这是OpenCV最基本的操作之一,也像是c语言的"hello world"的开始,恭喜跨入第一步.

当数据结构被建立之后,当然要做释放的动作啦,在这边IplImage的数据结构被建立,窗口接口的数据结构也被建立,当执行完就要做回收的动作啦,所有的 数据结构都会被malloc()配置空间,而cvLoadImage()只是把一连串的动作隐藏起来,cvLoadImage()不但做了配置 IplImage的数据结构空间,也把所有扩展名格式的数据初始化,将所有的数值及一些简单的分析都存在IplImage的数据结构内,方便做一些图像算法的运算,而窗口接口被cvNamedWindow()给建立,窗口的数据结构被隐含在cvNamedWindow()中,使用者只要使用"Show Image"等命名操作就可以使用GUI窗口的控制,这是一种分层抽象的概念,比较复杂的部分被程序代码包在它的下一层,因此,我只要操控该窗口的字串名 称("Show Image")就可以做任何想要的动作了.

这边用cvDestroyWindow()及 cvReleaseImage()回收给系统,回收的东西是內存,一般来说,不做內存回收也不会影响电脑的效能太大,操作系統也会自动的做垃圾收集,把一 些没意义的內存做删除,因此程序代码不多这两行也不会有太大的影响,不过这种东西毕竟是占用內存的,也不能确定它是不是永久占用(电脑关机后一定消失),因 此,养成良好的习惯是程序设计师必备的,尤其是在设计一个大的应用程序的时候.

简单的OpenCV读取图像程序文件码

 

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main()
{
    char FileName[10]="rain.jpg";

    IplImage *Image1 = cvLoadImage(FileName,1);

    cvNamedWindow("Show Image",0);

    cvResizeWindow("Show Image",300,400);

    cvShowImage("Show Image",Image1);

    cvWaitKey(0);

    cvDestroyWindow("Show Image");

    cvReleaseImage(&Image1);
}
 

 


图片:


执行结果: