问题:如何检索 Mat 图像中特定像素的通道值?
答案:
对于像素类型为 CV_8UC3(8 位无符号 3 通道图像)的 Mat 对象,可以使用以下方法:
for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Process the BGR values... } }
在此代码中,Vec3b 表示一个 3 通道像素,每个通道有 8 位无符号整数。 at 是一个成员函数,允许您访问指定行和列处的像素值。
性能优化:
为了提高性能,请考虑访问数据缓冲区直接:
uint8_t* pixelPtr = (uint8_t*)foo.data; int cn = foo.channels(); Scalar_<uint8_t> bgrPixel; for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R // Process the BGR values... } }
或者,也可以使用 row 方法:
int cn = foo.channels(); Scalar_<uint8_t> bgrPixel; for(int i = 0; i < foo.rows; i++) { uint8_t* rowPtr = foo.row(i); for(int j = 0; j < foo.cols; j++) { bgrPixel.val[0] = rowPtr[j*cn + 0]; // B bgrPixel.val[1] = rowPtr[j*cn + 1]; // G bgrPixel.val[2] = rowPtr[j*cn + 2]; // R // Process the BGR values... } }
注意:OpenCV 内部以 BGR 格式存储图像,而不是 RGB。
以上是如何在 OpenCV 中从 Mat 图像中提取像素通道值?的详细内容。更多信息请关注PHP中文网其他相关文章!