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的方式的主要内容,如果未能解决你的问题,请参考以下文章