Opencv遍历Mat的方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Opencv遍历Mat的方式相关的知识,希望对你有一定的参考价值。


文章目录

  • ​​Mat遍历​​
  • ​​坐标模式​​
  • ​​指针​​
  • ​​迭代器​​

Mat遍历

坐标模式

​.at<typename>(i,j)​

for(int i=0;i<img.rows;i++)  

for(int j=0;j<img.cols;j++)

//.at<Vec3b>(i,j)取出三通道的点 .at<uchar>(i,j)取出灰度图像的点
image.at<Vec3b>(i,j)[0]=image.at<Vec3b>(i,j)[0]/2;
image.at<Vec3b>(i,j)[1]=image.at<Vec3b>(i,j)[1]/2;
image.at<Vec3b>(i,j)[2]=image.at<Vec3b>(i,j)[2]/2;


Opencv定义了一个Mat的模板子类``Mat_`,它重载了operator()更方便取图像上的点

Mat m2(300, 500, CV_8UC3, Scalar(0, 0, 0));
Mat_<Vec3b> im = m2;
for (int i = 0; i < im.rows; i++)
for (int j = 0; j < im.cols; j++)
im(i, j)[0] = im(i, j)[0] + (uchar) (255 / 2);
im(i, j)[1] = im(i, j)[1] + (uchar) 0;
im(i, j)[2] = im(i, j)[2] + (uchar) (111 / 2);

指针

行指针

for (int row = 0; row < height; row++) 
Vec4b* it = img.ptr<Vec4b>(row);
for (int col = 0; col < width; col++)
(*it)[0]=0;
(*it)[1]=0;
(*it)[2]=0;
(*it)[3]=255;
it++;

数据指针

for (int row = 0; row < height; row++) 
const uchar* ptr = img.ptr(row);
for (int col = 0; col < width; col++)
ptr[0]=0;
ptr[1]=0;
ptr[2]=0;
ptr[3]=255;
ptr += 4;

迭代器

迭代器的方式还不怎么会用,也不习惯使用这种方式(比较慢)

Mat img(2, 2, CV_8UC3, Scalar(10,10,10));
cout << img << endl;
//如果要修改迭代器指向的值,可以使用 MatIterator_<Vec3b>
for (MatConstIterator_<Vec3b> it = img.begin<Vec3b>(); it != img.end<Vec3b>(); it++)
cout<<(*it)<<endl;

遍历的时间比较,可以看看这各个​​【OPENCV】cv::Mat像素遍历方法比较​​​opencv 遍历mat的三种方法
Mat像素点位置的读取和设置方式


以上是关于Opencv遍历Mat的方式的主要内容,如果未能解决你的问题,请参考以下文章

四种方式实现对OpenCV的MAT类矩阵元素的遍历

OpenCV Mat遍历的方法

OpenCV Mat遍历的方法

OpenCV中对Mat的遍历访问与赋值

行优先与列优先遍历opencv中Mat数据类型的效率差异

OpenCV基于字节指针进行高效像素遍历