当前位置: 首页 > news >正文

OpenCV C++ 中,访问图像像素三种常用方法

✅ OpenCV C++ 访问像素的三种方法
🔹 方法 1:cv::Mat::at<>() 方法(推荐用于调试和小规模访问)
📌 特点:

安全(带边界检查)
易用,语法直观
速度较慢(函数调用开销大)
适合调试、单点访问

🧩 语法:mat.at<数据类型>(行, 列)

cv::Mat img = cv::imread("image.jpg");// 访问灰度图像素(单通道)
if (img.channels() == 1) {uchar pixel = img.at<uchar>(100, 150);  // 第100行,第150列img.at<uchar>(100, 150) = 255;          // 修改像素
}// 访问彩色图像素(三通道 BGR)
if (img.channels() == 3) {cv::Vec3b pixel = img.at<cv::Vec3b>(100, 150);uchar blue  = pixel[0];uchar green = pixel[1];uchar red   = pixel[2];// 修改像素为红色img.at<cv::Vec3b>(100, 150) = cv::Vec3b(0, 0, 255);
}

⚠️ 注意:

类型必须匹配,否则会崩溃
cv::Vec3b 表示 3 个 unsigned char 的向量(BGR)

🔹 方法 2:指针访问 cv::Mat::ptr<>()(推荐用于遍历整行或全图)
📌 特点:

速度快(直接指针操作)
常用于遍历图像每一行
无边界检查,需手动确保索引合法
最适合性能敏感的场景

🧩 语法:

uchar* row_ptr = mat.ptr<uchar>();
row_ptr[* 通道数 + 通道索引]
cv::Mat img = cv::imread("image.jpg");for (int i = 0; i < img.rows; ++i) {uchar* row_ptr = img.ptr<uchar>(i);  // 指向第 i 行首地址for (int j = 0; j < img.cols; ++j) {// 三通道图像:BGRuchar blue  = row_ptr[j * 3 + 0];uchar green = row_ptr[j * 3 + 1];uchar red   = row_ptr[j * 3 + 2];// 修改为灰色uchar gray = (blue + green + red) / 3;row_ptr[j * 3 + 0] = gray;row_ptr[j * 3 + 1] = gray;row_ptr[j * 3 + 2] = gray;}
}

✅ 优势:

内层循环中 row_ptr 是连续内存访问,CPU 缓存友好
比 at<>() 快 5~10 倍

🔹 方法 3:迭代器访问(安全且适合 STL 风格编程)
📌 特点:

安全(带边界检查)
风格现代,类似 STL
速度中等
适合需要安全遍历的场景

🧩 语法:

cv::MatIterator_<数据类型> it, end;
for (it = mat.begin<数据类型>(), end = mat.end<数据类型>(); it != end; ++it)
cv::Mat img = cv::imread("image.jpg");
cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);  // 转为灰度图便于演示// 使用迭代器遍历所有像素
cv::MatIterator_<uchar> it, end;
for (it = img.begin<uchar>(), end = img.end<uchar>(); it != end; ++it) {*it = 255 - *it;  // 反色操作
}
cv::Mat color_img = cv::imread("image.jpg");
cv::MatIterator_<cv::Vec3b> it, end;
for (it = color_img.begin<cv::Vec3b>(), end = color_img.end<cv::Vec3b>(); it != end; ++it) {(*it)[0] = 0;  // B = 0(*it)[1] = 0;  // G = 0// 保持 R 不变 → 变红图
}

在这里插入图片描述

http://www.dtcms.com/a/536174.html

相关文章:

  • MATLAB基于小波云模型时间序列预测,以年径流预测为例
  • 项目名称:烟酒进销存管理系统
  • web开发,在线%蛋糕销售%管理系统,基于asp.net,webform,c#,sql server
  • UE5 蓝图-25:主 mainUI界面蓝图,右侧的颜色按钮的实现,换色逻辑与材质参数集,
  • 腾讯优图开源Youtu-Embedding通用文本表示模型,用处在哪?
  • parser_error UnicodeDecodeError: ‘utf-8‘ codec can‘t decode bytes
  • 慕课网站开发wordpress 当前页面登录密码
  • 从零学习 Agentic RL(四)—— 超越 ReAct 的线性束缚:深入解析 Tree-of-Thoughts (ToT)
  • 宁德城乡建设网站首页无法删除wordpress
  • Spring Boot3零基础教程,天气 API 测试,笔记73
  • 基于 STM32 的智能语音唤醒与关键词识别系统设计 —— 从硬件集成到算法实现
  • Redis数据库基础命令
  • 1.3 StorageTransient的gas计算
  • 物联网技术与基础第六节上课笔记
  • SAP SD系统开票查询报表分享
  • it网站设计培训制作网站的工具
  • 南京网站建设工作室电商卖什么产品有前景
  • iOS 开发推送功能全流程详解 从 APNs 配置到上架发布的完整实践(含跨平台上传方案)
  • 李宏毅机器学习笔记33
  • 深入理解Bitbucket Pipelines:强大的CICD开源解决方案
  • Android 14 系统启动流程深度解析:rc文件的语法、解析及常见语法详解
  • 商城网站的seo优化改怎么做软件公司 网站建设费分录
  • 免费做淘宝客网站有哪些石家庄网站优化推广
  • 【瑆箫】正式入驻爱发电平台
  • 第三十三篇:贪心算法(二):区间调度与跳跃游戏
  • 美颜SDK跨平台适配实战解析:让AI美颜功能在iOS与Android都丝滑运行
  • 条款24:区分通用引用和右值引用
  • zookeeper + kafka
  • 旅游网站建设与规划网站可以做被告嘛
  • 医护上门系统开发的关键技术解析与实践指南