1.1 Mat类简介及如何创造一个Mat对象
在学习opencv进行图像处理的时候,遇到的第一个类就是Mat对象。关于Mat类的介绍以及用法还有如何创建一个Mat对象如这篇博文所示:
https://blog.csdn.net/CV_Jason/article/details/54928920
为了进一步形象的理解Mat对象的数据存储方式,参考以下内容
图像容器Mat
还是先看Mat的存储形式。Mat和Matlab里的数组格式有点像,但一般是二维向量,如果是灰度图,一般存放
单通道灰度图数据存放格式:
多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:
注意通道的顺序反转了:BGR。通常情况内存足够大的话图像的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,这中情况在访问时可以提供很大方便。可以用 isContinuous()函数来判断图像数组是否为连续的。
原文链接:https://blog.csdn.net/xiaowei_cqu/article/details/7771760
1.2 访问像素的方法总结
主要参考以下博文:
https://blog.csdn.net/xiaowei_cqu/article/details/19839019
1.3 实例
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc,char*argv[]){
Mat src;
src = imread("F:\\opencv练习\\C++Test\\1-data image process\\2-图像卷积\\test.jpg");
if (!src.data)
{
cout << "It could not load image..." << endl;
return -1;
}
namedWindow("original image",WINDOW_AUTOSIZE);
imshow("original image", src);
//像素访问方法Mat类存储灰度图像时用
//第一种:使用.ptr<>()和[]
Mat gray_src;
cvtColor(src, gray_src, COLOR_BGR2GRAY);
namedWindow("gray image", WINDOW_AUTOSIZE);
imshow("gray image",gray_src);
cout << gray_src.size() << endl;
int col = gray_src.cols;//表示列
int row = gray_src.rows;//表示行
/*for (int i = 0; i < row;i++)
{
const uchar*data = gray_src.ptr
for (int j = 0; j < 5;j++)
{
out_put = data[j];
cout << out_put << endl;
//int gray = gray_src.at
// gray_src.at
}
} */
//第二种方法:使用.ptr<>()和位移指针*++的组合方法访问某一行中所有像素的值
/*for (int i = 0; i < 1;i++)
{
const uchar*data = gray_src.ptr
for (int j = 0; j < col;j++)
{
int out_put= *data++;
cout << out_put << endl;
}
}*/
//第三种方法:用Mat提供的迭代器Mat _iterator
cv::Mat_
cv::Mat_
for (; it != itend; ++it)
{
int a= (*it)[0];
int b = (*it)[1];
int c = (*it)[2];
//cout << a << b << c << endl;
cout << *it << endl;
}waitKey(0);
return 0;
}
具体的区别和用法参见下面的博客
https://blog.csdn.net/u011574296/article/details/70139563
最快区别为
使用ptr指针访问像素时访问任意一行像素的首地址,特别方便图像的一行一行的横向访问,如果需要一列一列的纵向访问图像,就稍微麻烦一点,<>中一般是uchar。
使用at访问像素时,使用调用方法image.at