在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

Posted

技术标签:

【中文标题】在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)【英文标题】:What's the interpretation of `type` for a std::vector instead of a cv::Mat in OpenCV and how can I change it? (C++)在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是什么,我该如何更改它? (C++) 【发布时间】:2015-04-17 07:45:31 【问题描述】:

我想使用 OpenCV 中的 adaptiveThreshold 函数,该函数在 documentation 中定义如下:

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)

我不想使用Mat 作为输入,而是使用vector<double>。这应该是可能的,因为我在documentation 中阅读了以下内容:

当您在参考手册或 OpenCV 源代码中看到 接受InputArray的函数,表示你实际上可以通过 MatMatxvector<T> 等(参见上面的完整列表)。

我正在使用以下代码:

vector<double> diffs; // <initialized with a number of double values>
double maxValue = 255.0; // values in diffs above the threshold will be set to 255.0
vector<double> out; // stores the output values (either 0 or 255.0)
adaptiveThreshold(diffs, out, maxValue, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);

但是,在运行代码时出现以下错误:

OpenCV 错误:断言失败 (src.type() == CV_8UC1) 在 adaptiveThreshold,文件 /Users/nburk/Developer/SDKs/opencv-2.4.10/modules/imgproc/src/thresh.cpp, 第 796 行

libc++abi.dylib: 以未捕获的类型异常终止 cv::Exception: /Users/nburk/Developer/SDKs/opencv-2.4.10/modules/imgproc/src/thresh.cpp:796错误:(-215) src.type() == CV_8UC1 在函数 adaptiveThreshold

现在,我知道调用失败是因为输入的 type 实际上不是 CV_8UC1。但我不知道如何解决这个问题。我认为type 属性只与Mat 对象相关,我不知道如何为vector 解释它。

我也不确定在文档中的何处阅读有关此问题的信息。我在Mat 的docs 中找到了以下语句,但这对解决我的问题没有多大帮助:

type – 数组类型。使用CV_8UC1, ..., CV_64FC4 创建 1-4 通道 矩阵,或CV_8UC(n),...,CV_64FC(n) 创建多通道(最多 CV_CN_MAX 频道)矩阵。

更新:上面说type其实是一个数组类型,但这是什么意思呢?如何使我的vector&lt;double&gt; 获得使用adaptiveThreshold 所需的类型CV_8UC1

另一个更新: 在阅读了 O'ReillyLearning OpenCV 一书后,我学到了以下内容:

type 可以是一长串预定义的表单类型中的任何一个: CV_&lt;bit_depth&gt;(S|U|F) C&lt;number_of_channels&gt;。因此,矩阵可以 由 32 位浮点数 (CV_32FC1) 组成,无符号整数 8 位 三胞胎 (CV_8UC3),或无数其他元素。

所以,很明显,在我的例子中,vector&lt;double&gt; 不是CV_8UC1 类型,因为double 显然不是_unsigned 8-bit integer。但是,我可以将我刚刚所做的这些值标准化。结果是一个vector&lt;int&gt;,其值仅介于0255 之间。因此,它应该是CV_8UC1 类型,对吧?但是,我仍然遇到同样的错误......

【问题讨论】:

类型不匹配。 INT 和 UNSIGNED CHAR 是不同的。尝试将 vector 转换为 vector 然后它应该可以工作。 谢谢!这确实解决了这个问题!但是,我现在收到另一个断言错误(mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) &amp;&amp; ((1 &lt;&lt; type0) &amp; fixedDepthMask) != 0))......无论如何,由于您的提示,这个问题得到了解决。如果您发表评论作为答案,我将接受它。 :) 您是否在同一个函数中遇到此错误? 不,它说它发生在 创建中,文件 /Users/nburk/Developer/SDKs/opencv-2.4.10/modules/core/src/matrix.cpp,第 1486 行 您是否尝试将输出向量作为双精度类型? 【参考方案1】:

类型不匹配。 intunsigned char 是不同的。尝试将vector&lt;int&gt; 转换为vector&lt;unsigned char&gt;,然后它应该可以工作。

【讨论】:

以上是关于在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

传递 opencv inputarray 并将其用作 std::vector

如何使 std::vector 的 operator[] 编译在 DEBUG 中而不是在 RELEASE 中进行边界检查

在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

在 C++ std::vector 和 C 数组之间转换而不复制

std::vector 到 boost::python::list 而不复制数据

std::vector of OpenCV 点,没有 push_back 方法