矩阵元素访问
OpenCV: Matrix element access
我使用OpenCV 3.0从文件中加载图像,然后将该数据存储在数组中。
如果我使用:
cv::Mat image = cv::imread("myimage.png");
uchar pixel = image.at<uchar>(50, 100);
它会给出图像坐标(x = 100, y = 50)处的像素值
但是,如果我现在将图像内存复制到数组中:
uchar data[image.rows * image.cols];
memcpy(data, image.data, image.rows * image.cols);
然后从这个数组中读取像素值:
uchar pixel = data[100 * image.cols + 50];
那么它给出的值就和之前的不一样了
我想知道为什么会这样?是因为OpenCV不以这种方式将其内存存储为单个数组吗?如果是这样,我如何将内存复制到数组,然后直接从该数组访问像素值?
谢谢:)
这是因为OpenCV使用了padding。
每行可能包含额外的字节以确保更好的对齐。
复制你的数据,如果你想它没有填充:
for ( int i=0; i<image.rows; ++i )
memcpy( &data[i*100], image.data + image.step*i, 50);
同样,数据按水平线(行)排列。所以你应该这样访问它:
image.at<uchar>(Y,X).
uchar pixel = data[Y*image.cols + X];
或者你可以复制它,包括padding:
memcpy( data, image.data, image.step*image.rows);
然后你必须使用大小为image的行来访问它。步骤(可以等于或大于image.cols)。
uchar pixel = data[Y*image.step + X];
相关文章:
- 序列容器 - 只能按顺序访问元素
- 我无法在用forward_as_tuple创建的元组中按类型访问元素
- 如果验证容器的大小并在同一条件语句下访问元素,这是很好的做法吗?
- 需要从字符串数组的一部分访问元素
- 从 C++ 中的 int ** 数组访问元素
- std::unordered_map如何存储和比较其密钥,以实现无需订购即可快速访问元素?
- std::array :通过智能指针访问元素的成员
- C 在类对象的向量中访问元素
- 使用迭代器访问元素
- 为什么在指针上对成员访问/元素选择有不同的运算符
- 矢量C++大小和访问元素
- 2D阵列访问元素和地址
- 使用C++迭代器访问元素
- C++可变参数模板数组/访问元素
- 向量是否比std::array多使用一个解引用来访问元素
- 来自 Mat 的 OpenCV 访问元素
- 为什么在访问元素之前在容器上使用 std::forward
- 在指向 wstring 的指针上使用 [ ] 运算符访问元素
- c++ char指针数组-不能访问元素
- 在整数和向量对的向量中访问元素