opencv取图片像素的方法

本文介绍了两种使用OpenCV访问图像像素的方法:一是通过指针直接访问,二是利用.at()成员函数。具体展示了如何获取不同类型的图像(如灰度图、深度图及RGB图像)的特定像素值。

第一种:使用指针 image.ptr<uchar>(m)[n])

double d0 = ushort(depth.ptr<ushort>(m)[n]) ;

RGB:

double b0 = rgb.ptr<uchar>(m)[n * 3];

double g0 = rgb.ptr<uchar>(m)[n * 3 + 1];

double r0 = rgb.ptr<uchar>(m)[n * 3 + 2];


第二种:image.at

double d1 = depth.at<ushort>(y1, n);

C++ 中使用 OpenCV 获取图像像素值是一个基础但重要的操作。OpenCV 提供了多种方式来访问和修改图像的像素值,具体决于图像类型(如灰度图、彩色图)和性能需求。 下面是一个完整的示例:**使用 OpenCV图像并获取指定位置的像素值**。 ```cpp #include <iostream> #include <opencv2/opencv.hpp> int main() { // 读图像(默认以彩色模式加载) cv::Mat image = cv::imread("example.jpg"); // 检查图像是否成功加载 if (image.empty()) { std::cerr << "无法加载图像,请检查文件路径!" << std::endl; return -1; } // 假设我们想获取坐标 (x=100, y=50) 处的像素值 int x = 100, y = 50; // 确保坐标在图像范围内 if (y >= image.rows || x >= image.cols) { std::cerr << "坐标超出图像范围!" << std::endl; return -1; } // 根据图像类型获取像素值 if (image.channels() == 3) { // BGR 彩色图像 cv::Vec3b pixel = image.at<cv::Vec3b>(y, x); // 注意:at(row, col) -> at(y, x) uchar blue = pixel[0]; uchar green = pixel[1]; uchar red = pixel[2]; std::cout << "像素 (" << x << ", " << y << ") 的 BGR 值: " << (int)blue << ", " << (int)green << ", " << (int)red << std::endl; } else if (image.channels() == 1) { // 灰度图像 uchar intensity = image.at<uchar>(y, x); std::cout << "像素 (" << x << ", " << y << ") 的灰度值: " << (int)intensity << std::endl; } return 0; } ``` --- ### ✅ 代码解释: - `cv::Mat image = cv::imread("example.jpg");` 加载图像。如果文件不存在或格式不支持,则返回空矩阵。 - `image.empty()` 检查图像是否正确加载。 - `image.at<cv::Vec3b>(y, x)` 访问图像中第 `y` 行、第 `x` 列的像素OpenCV 中图像是按 **行优先** 存储的,所以是 `.at(row, col)` 即 `.at(y, x)`。 - `cv::Vec3b` 表示一个包含 3 个 `unsigned char` 的向量,用于存储 BGR 图像的像素(Blue, Green, Red)。 - `uchar` 对于灰度图,每个像素是一个 `unsigned char` 类型的亮度值(0~255)。 > ⚠️ 注意:OpenCV 默认以 **BGR** 顺序存储彩色图像,而不是 RGB! --- ### 📌 示例输出: 假设你在 `(100, 50)` 处有一个红色像素: ``` 像素 (100, 50) 的 BGR 值: 0, 0, 255 ``` --- ### 🔧 其他常用方法(高性能场景) 如果你需要遍历整张图像的所有像素,使用 `.at<>` 会比较慢。可以使用指针方式提高效率: #### 遍历所有像素(彩色图像)示例: ```cpp for (int y = 0; y < image.rows; ++y) { for (int x = 0; x < image.cols; ++x) { cv::Vec3b& pixel = image.at<cv::Vec3b>(y, x); uchar b = pixel[0], g = pixel[1], r = pixel[2]; // 处理像素... } } ``` #### 使用数据指针(更快): ```cpp for (int y = 0; y < image.rows; ++y) { cv::Vec3b* ptr = image.ptr<cv::Vec3b>(y); // 获取第 y 行的指针 for (int x = 0; x < image.cols; ++x) { cv::Vec3b pixel = ptr[x]; uchar b = pixel[0], g = pixel[1], r = pixel[2]; // 处理... } } ``` --- ### ❗注意事项: - 图像必须已经加载成功(非空)。 - 坐标 `(x, y)` 必须满足:`0 <= x < cols`, `0 <= y < rows`。 - 数据类型要匹配:`CV_8UC1` 用 `uchar`,`CV_8UC3` 用 `cv::Vec3b`。 - 如果你是从摄像头或视频中读,确保帧有效。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值