访问opencv矩阵CV_32S元素

Posted

技术标签:

【中文标题】访问opencv矩阵CV_32S元素【英文标题】:Access opencv matrix CV_32S element 【发布时间】:2012-10-08 15:49:53 【问题描述】:

如果我有一个CV_32SC1 类型的矩阵,我应该在函数Mat::at 中使用什么类型名?

例如

Mat X;  // for example eye matrix of size 10,10,and type CV_32SC1
X.at<??????>(1,1)=5;

如何找到其他矩阵类型的类型名称?

【问题讨论】:

【参考方案1】:

OpenCV 中矩阵类型名称的一般规则是:

 CV_<bit_depth>(S|U|F)C<number_of_channels>

S = Signed integer
U = Unsigned integer
F = Float 

因此,根据您之前使用的字母(S、U、F)中的哪一个,您将投射&lt;int&gt;&lt;unsigned integer&gt;&lt;float&gt;

【讨论】:

实际上请read您点击批准的评论。 在这种情况下,我更喜欢 而不是 ,因为 C++ 标准没有指定整数类型的位大小。 没有 CV_32U* 类型。但如果您的 CV_32SC1 数组实际上包含无符号值,您仍然可以使用 X.at&lt;uint32_t&gt;(i,j)【参考方案2】:

CV_32SC1 是一个 1 通道的有符号 32 位整数,那么我认为 X.at&lt;int&gt;() 应该这样做。

Mat 已经“知道”如何寻址像素,该类型只是将位转换为表达式评估所需的 C++ 值。

我找到了here 一些关于符号的解释。

【讨论】:

不完全正确。对于at&lt;T&gt;,x 方向的寻址完全基于 T 的大小。如果您的矩阵是 CV_8UC3,那么X.at&lt;cv::Vec3b&gt;(0,2) 将为您提供第一行的第三个像素;但是X.at&lt;uint8_t&gt;(0,2*3+1) 将为您提供相同像素的第二个通道(即与X.at&lt;cv::Vec3b&gt;(0,2)[1] 相同的字节因此,x 方向的间距基于编译时常数sizeof(T) 而不是基于从存储在 Mat 对象中的类型,这在性能上有相当大的差异。它还支持多通道 arr 的“平面”视图。

以上是关于访问opencv矩阵CV_32S元素的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中分配矩阵元素

打印 CV_32F opencv 矩阵值

OpenCV:访问 5D 矩阵的元素

OpenCV——图像的深度与通道数讲解

opencv多通道元素访问

如何使用 opencv 库将 3D 矩阵的元素归零?