访问图像像素

at方法

  • 基于Mat对象的随机像素访问API实现,通过行列索引方式遍历每个像素值
void method_1(Mat & img)
{
int h = img.cols;
int w = img.rows;
for (int row = 0; row < w; row++)
{
for (int col = 0; col < h; col++)
{
Vec3b bgr = img.at<Vec3b>(row, col);
img.at<Vec3b>(row, col)[0] = 255 - bgr[0];
img.at<Vec3b>(row, col)[1] = 255 - bgr[1];
img.at<Vec3b>(row, col)[2] = 255 - bgr[2];
}
}
}

指针ptr

  • 基于Mat对象的行随机访问指针方式实现对每个像素的遍历
void method_2(Mat & img)
{
int h = img.cols;
int w = img.rows;
int dims = img.channels();
for (int row = 0; row < w; row++)
{
uchar * ptr = img.ptr<uchar>(row);
for (int col = 0; col < h * dims; col++)
{
int pv = ptr[col];
ptr[col] = 255 - pv;
}
}
}

data指针

  • 直接获取Mat对象的像素块的数据指针
void method_4(Mat & img)
{
int h = img.cols;
int w = img.rows;
for (int row = 0; row < w; row++)
{
uchar * uc_pixel = img.data + row * img.step;
for (int col = 0; col < h; col++)
{
uc_pixel[0] = 255 - int(uc_pixel[0]);
uc_pixel[1] = 255 - int(uc_pixel[1]);
uc_pixel[2] = 255 - int(uc_pixel[2]);
uc_pixel += 3;
}
}
}

迭代器

  • Mat类变量同时也是一个容器变量,因此,Mat类变量拥有迭代器,用于访问Mat类变量中的数据,通过迭代器可以实现对矩阵中每一个元素的遍历
void method_3(Mat & img)
{
Mat_<Vec3b>::iterator it = img.begin<Vec3b>();
Mat_<Vec3b>::iterator it_end = img.end<Vec3b>();
while (it != it_end)
{
(*it)[0] = 255 - (*it)[0];
(*it)[1] = 255 - (*it)[1];
(*it)[2] = 255 - (*it)[2];
it++;
}
}

测量运行时间

  • cv::getTickCount():返回自某个事件以来系统CPU的滴答声
  • cv::getTickFrequency():返回CPU在一秒内发出多少次滴答声

测量两个操作之间经过的时间:

cout.setf(ios_base::fixed, ios_base::floatfield);
double t = (double)getTickCount();
// do something...
t = ((double)getTickCount() - t / getTickFrequency()) * 1000;
cout << "Times passed in seconds: " << t << endl;


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   TNTksals  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示