安装好opencv2.2后,就可以试试编写一些简单的程序了。
同时在安装目录下有一些例子,很不错,可以看看。下面是对opencv的初级运用:打开并显示出一幅图像。
先给出一个函数:cvLoadImage(arg1,arg2)。从这个函数的名字就知道这是读入一张图像。带2个参数,还回值是一个IpImage的指针。
arg1:filename,文件的名字
arg2:可以有3个值。-1,以原始通道数读入;0,强制转化为灰度;1,读取彩色图像。
然后是使用cvNameWindow和cvShowImage来创建窗口,显示图像。
这样就简单的显示出一幅图像。下面是一个写好C的例子,可以参考下。
***********************************************************************
* OpenCV example
* By Shiqi Yu 2006
***********************************************************************/
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
IplImage* pImg; //声明IplImage指针
//载入图像
if( argc == 2 &&
(pImg = cvLoadImage( argv[1], 1)) != 0 )
{
cvNamedWindow( "Image", 1 );//创建窗口
cvShowImage( "Image", pImg );//显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &pImg ); //释放图像
return 0;
}
return -1;
}
同时也有一个C++的例子
/***********************************************************************
* OpenCV 2.1 example
* By Pebbler Chung 2010
***********************************************************************/
#include "cv.h"
#include "highgui.h"
using namespace cv; //下面的所有cv相关类型不用加上前缀了
int main(int argc, char* argv[])
{
Mat img = imread("lena.jpg"); //声明Mat变量并调入lena小妞(老妞了现在?)的照片
if(!img.data) //判断图片调入是否成功
return -1; //调入图片失败则退出
namedWindow("loveLena", CV_WINDOW_AUTOSIZE); //创建窗口,并确定其为大小不可变类型窗口
imshow("loveLena", img); //显示图片。如果你不介意窗口大小可变,可以直接注释掉上一句。因为imshow可以直接创建窗口
waitKey(); //等待按键
return 0;
}
需要说明的是C++版的图像不用费心release,在析构中会帮你搞定。同时可以看到出现了一张名为“lena.jpg”的图像。这是一张对比很强的图片很出名,同时也很养眼,呵呵。大家有兴趣可以去搜一下。我记得这是一张playboy的封面图。
上图就是那张了,全图可以去搜索。
重点来了。上面都是对图片(已经有格式头)的处理。很多时候情况是对原始数据进行处理。也就是说只有图像数据,没格式头。现在有3张办法
1.使用工具(或自己写个matlab或者C++的小程序)进行处理。将图像数据打包成图片格式。
2.使用mat格式。在opencv中有矩阵类型。可以将数据直接读入,然后处理矩阵。
3.对图像数据(data)进行处理。这是我常用的一种方法。
下面对第3种方法进行简单介绍。
在opencv中一般我喜欢将图像装入IpImage这给类。原因是函数多,简单。在IpImage中有成员变量data。从名字就可以看出是这个图像的数据存放指针。做法就是使用cvCreatImage初始化IpImage的大小,然后直接向data写入图像数据。这里对指针的使用很暴力,谨慎操作。下面贴出我的代码,很暴力。
int CSAR_window::load(CString Filepath,u_char* buff)
{
cvReleaseImage(&Image);
Image=cvCreateImage(cvSize(this->srcImage_width,srcImage_height),8,1);
FILE *fp;
fp=_tfopen( Filepath.GetString(),_T("r"));
if(fp==NULL)
{
return 0;
}
fread(Image->imageData,1,srcImage_width*srcImage_height,fp);
fclose(fp);
//Image->imageData = (char*)buff;
//cvWaitKey(0);//等待按键
return 1;
}