这次学习一下OpenCV里面基本的操作,这里以C++接口为例。

实验环境是:VS2010 +OpenCV 2.4.8。

实验代码:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	char*	imageName = "C:HappyFish.jpg";

	Mat	image;
	image = imread(imageName, 1);

	if (!image.data)
	{
		printf("No image data!n");
		return -1;
	}

	Mat	gray_image;
	cvtColor(image, gray_image, CV_BGR2GRAY);

	imwrite("C:GrayHappyFish.jpg", gray_image);

	namedWindow(imageName, CV_WINDOW_AUTOSIZE);
	namedWindow("Gray image", CV_WINDOW_AUTOSIZE);

	imshow(imageName, image);
	imshow("Gray image", gray_image);

	waitKey(0);

	return 0;
}

该程序实现的功能是读入一张图像,将其变为灰度图,在窗口显示,保存灰度图。

知识点1:imread( )函数

函数原型:Mat

imread(

const string& filename, int flags=1

)

首先创建了一个Mat对象image用于存储图像信息(只分配了头信息)。然后使用imread函数,从磁盘上读取一个图像。imread函数的第一个参数是要读取的图像的路径,第二个参数是读取的方式。函数根据路径上图像文件的前几个字节来确定图像的编码格式,而不是分析扩展名。读取方式有几个值可以选择:CV_LOAD_IMAGE_COLOR(默认值)、CV_LOAD_IMAGE_GRAYSCALE、CV_LOAD_IMAGE_ANYDEPTH、CV_LOAD_IMAGE_ANYCOLOR、CV_LOAD_IMAGE_UNCHANGED。默认情况下,图像是以每个通道8位,3个通道的形式被读入,这意味着不管原始图像通道数为多少,都将被转换为3通道读入。其他的标识将以其他方式读入,意思基本如起名字。

知识点2:cvtColor( )函数

函数原型:void

cvtColor(

InputArray src, OutputArray dst, int code, int dstCn=0

)

该函数非常常用,用于将图像从一个颜色空间转换到另一个颜色空间。具体转换由第三个参数code决定。例子中是将一个RGB图转换为灰度图。

知识点3:imwrite( )函数

函数原型:bool

imwrite(

const string& filename, InputArray img, const vector<int>& params=vector<int>()

)

该函数用于图像的保存。

知识点4:namedWindow( )函数

函数原型:void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )

该函数属于HighGUI,用于创建窗口。第一个参数是窗口的名称,同时用作HighGUI中其他函数调用窗口的句柄。第二个参数有三个可选的标识:
WINDOW_NORMAL:用户可以任意改变窗口大小。
WINDOW_AUTOSIZE:窗口大小自适应图像,用户不能手动更改窗口大小(默认值)。
WINDOW_OPENGL:启动OpenGL支持创建窗口。

知识点5:imshow( )函数

函数原型:void imshow(const string& winname, InputArray mat)

该函数非常常用,用于在指定窗口上显示图像。如果窗口标志为WINDOW_AUTOSIZE,则窗口适应图像,否则图像适应窗口。

知识点6:waitKey( )函数

函数原型:int waitKey(int delay=0)

该函数在一个给定的时间内等待用户按键触发,多用于程序的暂停。如果用户在给定时间内按下了一个键,则返回用户按下的键,否则返回0。如果该函数参数为0(默认值),则函数会无限期等待,知道用户触发一个按键。

注:

1. 这里是以C++接口为例,但是大多数的函数都会在C接口里面有对应的函数,一般都是加一个cv前缀,而且使用方法也基本都一样。极大多数标志都可以通用。比如C++接口的namedWindow( )函数对应的C接口的函数为cvNamedWindow( ),两者的使用方法完全一样,而且标志也是通用的,WINDOW_NORMAL其实是C接口里面的CV_WINDOW_NORMAL,其他依次类推。所以,只要掌握一个接口的用法,使用另外一个就不在话下。以后都会以一个接口做介绍。

2. 这里对于很多函数的介绍都是非常简单的。但其实很多函数都有非常多的用法,特别是配合各种标志时功能就更丰富了。具体使用时还是要多看OpenCV官方的文档,这也是最好的学习方法。