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像素点位置的读取和设置方式