今天在看Opencv的SIFT源码,至于有关于SIFT算法的博客还没有写完,等着我把源码看完再一起写完吧。
之前用Opencv编过不少的程序了,没想道OpenCV 2.0版本里最基础的Mat类用法还是有些不清楚,这里就总结一下
一、Mat类的综述
1、Mat类存储图像
Mat类是OpenCV里使用广泛的一个类,其中我认为最重要的一个作用就是作为存储图像的数据结构。那么Mat类如何存储的图像呢?
我们都知道图像分为彩色图像和灰度图像,这里我有一个误区,一直认为彩色图像是一种三维矩阵,就是立方体的那种结构,一个图像分为三层。
但是这种理解是错误的,是错误的,是错误的!
其实在存储的图像不管是彩色的还是灰度图像,都是二维的矩阵,具体的存储格式如下
(1)灰度图像的格式:
(2)彩色图像的格式:
看到了吗,虽然彩色图像由BGR三个通道,但是是存储在同一个平面内的,只不过OpenCV在这里把三列才当作一列,因此有img.cols等于图像的列数。
一般我们用Opencv读取的灰度图像的数据类型为uchar类型的,而彩色图像的一个像素的数据类型为<Vec3b>类型的,灰度图一个像素占用1个字节,而彩色图像一个像素3个字节。
接下来就引出了我们如何按像素读取图像呢?
2、Mat按像素读取图像内容
这里主要介绍两种方法,一种非常简单,易于编程,但是效率会比较低;另外一种效率高,但是不太好记。下面依次看代码:
(1)易于编程的
对于灰度图像进行操作:
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("1.jpg");
resize(img, img, Size(375, 500));//resize为500*375的图像
cvtColor(img, img, CV_RGB2GRAY);//转为灰度图
imshow("gray_ori", img);
for (int i = 0; i < img.rows; i++)