OpenCV Mat 到数组访问
OpenCV Mat to array access
我无法访问来自 Mat.data 的数据。我对图片执行操作,我需要分别访问每个像素。
我必须对简单类型(float、int 等)进行必要的操作。
我访问数据的方式如下:
for (int idx = 0; idx < image.rows; idx++) {
for (int idy = 0; idy < image.cols; idy++) {
int color_tid = idx * image.cols * image.channels() + idy * image.channels();
uint8_t blue = image.data[color_tid];
uint8_t green = image.data[color_tid + 1];
uint8_t red = image.data[color_tid + 2];
float pixelVal = (int) blue + (int) green + (int) red;
(...)
}
}
此方法仅适用于正方形图像(NxN 像素),但对于 NxM 正方形区域(较小的边缘)之外存在异常。
有谁知道任何其他方式来访问图片垫的数据?
示例图片(正确结果):
异常(我的问题)
您问题中的代码存在一些缺陷:
- 交换行和列(行是 Y,列是 X)
- 行之间的步长(又名 "stride")并不总是等于列数
使用Mat::at<>
使代码更简单:
for(int row = 0; row < image.rows; ++row)
{
for(int col = 0; col < image.cols; ++col)
{
const Vec3b& pt = image.at<Vec3b>(row, col);
float pixelVal = pt[0] + pt[1] + pt[2];
...
}
}
我建议在 Mat
中关注 data layout
所以你的循环变成:
for (int r = 0; r < img.rows; ++r)
{
for (int c = 0; c < img.cols; ++c)
{
uchar* ptr = img.data + img.step[0] * r + img.step[1] * c;
uchar blue = ptr[0];
uchar green = ptr[1];
uchar red = ptr[2];
float pixelVal = blue + green + red;
}
}
您最终可以少执行一些操作,例如:
for (int r = 0; r < img.rows; ++r)
{
uchar* pt = img.data + img.step[0] * r;
for (int c = 0; c < img.cols; ++c)
{
uchar* ptr = pt + img.step[1] * c;
uchar blue = ptr[0];
uchar green = ptr[1];
uchar red = ptr[2];
float pixelVal = blue + green + red;
}
}
我无法访问来自 Mat.data 的数据。我对图片执行操作,我需要分别访问每个像素。 我必须对简单类型(float、int 等)进行必要的操作。 我访问数据的方式如下:
for (int idx = 0; idx < image.rows; idx++) {
for (int idy = 0; idy < image.cols; idy++) {
int color_tid = idx * image.cols * image.channels() + idy * image.channels();
uint8_t blue = image.data[color_tid];
uint8_t green = image.data[color_tid + 1];
uint8_t red = image.data[color_tid + 2];
float pixelVal = (int) blue + (int) green + (int) red;
(...)
}
}
此方法仅适用于正方形图像(NxN 像素),但对于 NxM 正方形区域(较小的边缘)之外存在异常。 有谁知道任何其他方式来访问图片垫的数据? 示例图片(正确结果):
异常(我的问题)
您问题中的代码存在一些缺陷:
- 交换行和列(行是 Y,列是 X)
- 行之间的步长(又名 "stride")并不总是等于列数
使用Mat::at<>
使代码更简单:
for(int row = 0; row < image.rows; ++row)
{
for(int col = 0; col < image.cols; ++col)
{
const Vec3b& pt = image.at<Vec3b>(row, col);
float pixelVal = pt[0] + pt[1] + pt[2];
...
}
}
我建议在 Mat
所以你的循环变成:
for (int r = 0; r < img.rows; ++r)
{
for (int c = 0; c < img.cols; ++c)
{
uchar* ptr = img.data + img.step[0] * r + img.step[1] * c;
uchar blue = ptr[0];
uchar green = ptr[1];
uchar red = ptr[2];
float pixelVal = blue + green + red;
}
}
您最终可以少执行一些操作,例如:
for (int r = 0; r < img.rows; ++r)
{
uchar* pt = img.data + img.step[0] * r;
for (int c = 0; c < img.cols; ++c)
{
uchar* ptr = pt + img.step[1] * c;
uchar blue = ptr[0];
uchar green = ptr[1];
uchar red = ptr[2];
float pixelVal = blue + green + red;
}
}