安装好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;
}