一、访问
对于Mat的访问有两种方式
第一种,利用Mat::at进行访问
//读取3通道彩色图像
Mat img = imread("图片地址");
int px;
//读取图像中第一行第一列,Blue通道数据
int px = img.at<Vec3b>(0, 0)[0];
第二种,利用Mat的成员ptr指针进行访问
//读取3通道彩色图像
Mat img = imread("图片地址");
//将Mat中的第一行地址赋予pxVec
uchar* pxVec=img.ptr<uchar>(0);
//遍历访问Mat中各个像素值
int i, j;
int px;
for (i = 0; i < img.rows; i++)
{
pxvec = img.ptr<uchar>(i);
//三通道数据都在第一行依次排列,按照BGR顺序
//依次赋值为1
for (j = 0; j < img.cols*img.channels(); j++)
{
px=pxvec[j];
//do anything
}
}
二、赋值
不能用Mat::at进行赋值,只能用ptr对Mat中的像素点进行赋值
一个完整的例子如下:
#include "stdafx.h"
#include <opencv2\core\core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <vector>
int main()
{
//对Mat进行遍历赋值
//初始化Mat数据结构,256*256,三通道8位(256色)图像
Mat myimg(256,256,CV_8UC3);
//取像素数据首地址
uchar* pxvec = myimg.ptr<uchar>(0);
int i, j;
for (i = 0; i < myimg.rows; i++)
{
pxvec = myimg.ptr<uchar>(i);
//三通道数据都在第一行依次排列,按照BGR顺序
//依次赋值为1
for (j = 0; j < myimg.cols*myimg.channels(); j++)
{
pxvec[j] = 1;
}
}
//展示图像
imshow("abc", myimg); waitKey(10000);
}
结果如下:
原文:
https://www.cnblogs.com/thundertt/p/6368754.html?utm_source=itdadao&utm_medium=referral