在上一节的OpenCV简介和配置中,我们写了第一个OpenCV程序,加载了一张图片并进行显示。下面先给出上一节的第一个OpenCV程序并进行说明。
// OpenCVTest.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <opencv2/opencv.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat img = cv::imread("J:\\VS2010Projects\\OpenCVTest\\OpenCVTest\\smallpi.jpg");
cv::imshow("hello world",img);
cv::waitKey(0);
return 0;
}
cv::imread函数
命名空间cv下的函数imread的原型为
Mat imread(const string& filename, int flags)
- 函数返回一个Mat类型的对象。
- 第一个参数指定图片的路径。
- 第二个参数指定图片加载格式。
第二个参数flags可以为下面三个中的一个。
CV_LOAD_IMAGE_UNCHANGED (以RGBA格式加载,一个像素占4byte内存)
CV_LOAD_IMAGE_GRAYSCALE (以灰度图像的格式加载,一个像素占1byte内存)
CV_LOAD_IMAGE_COLOR (以RGB格式加载,一个像素占3byte内存)
CV_LOAD_IMAGE_COLOR 是默认的图片加载格式。
Mat类
cv::imread函数读取图片后的就返回一个Mat类型的对象。Mat类对象保存着所加载图片的信息。
- Mat类的data属性为指向图像数值数组的第一个元素的unsigned char类型的指针。每一个矩阵元素为1byte的0~255的整数。
- 当为RGB格式加载图像时,图像数值数组的格式为 B值-G值-R值-B值......, 即数值数组的第一个元素为第一个像素的蓝色值, 数值数组的第二个元素为第一个像素的绿色值,数值数组的第三个元素为第一个像素的红色值....
- Mat类的rows()方法获得图像像素的行数,cols()方法获得图像像素的列数。
Mat类还有许多有用的属性和方法,以后用到时再作说明。
cm::imshow函数
cm::imshow函数的原型为
void imshow(const string &winname, cv::InputArray mat);
- 第一个参数指定应用程序的名称。
- 第二个参数为一个Mat类型的对象。
cm:; waitKey函数
waitKey在这里的作用是等待用户键盘或鼠标的输入,使得应用程序不会闪一下就退出了。
头文件引入
上面的OpenCV程序引入头文件的形式如下
#include <opencv2/opencv.hpp>
实际上,opencv.hpp文件的作用就是帮我们把所有的OpenCV头文件引入进来。opencv.hpp的源码如下。
#ifndef __OPENCV_ALL_HPP__
#define __OPENCV_ALL_HPP__
#include "opencv2/core/core_c.h"
#include "opencv2/core/core.hpp"
#include "opencv2/flann/miniflann.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include "opencv2/video/video.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#endif
这是一种头文件引入时偷懒的作法。引入所有的文件可能会增加程序的大小。
小结
- 对第一个OpenCV程序中的imread、imshow、waitKey函数进行的小小的说明。
- 说明了OpenCV库的引入方式。