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 中的 adaptiveThreshold
函数,它在 documentation 中定义如下:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
我不想使用 Mat
作为输入,而是想使用 vector<double>
。这应该是可能的,因为我在 documentation:
中阅读了以下内容
When you see in the reference manual or in OpenCV source code a
function that takes InputArray
, it means that you can actually pass
Mat
, Matx
, vector<T>
etc. (see above the complete list).
我正在使用以下代码:
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 Error: Assertion failed (src.type() == CV_8UC1
) in
adaptiveThreshold
, file
/Users/nburk/Developer/SDKs/opencv-2.4.10/modules/imgproc/src/thresh.cpp,
line 796
libc++abi.dylib
: terminating with uncaught exception of type
cv::Exception
:
/Users/nburk/Developer/SDKs/opencv-2.4.10/modules/imgproc/src/thresh.cpp:796:
error: (-215) src.type() == CV_8UC1
in function adaptiveThreshold
现在,我明白调用失败是因为输入的 type
实际上不是 CV_8UC1
。但我不知道如何解决这个问题。我以为 type
属性 只与 Mat
对象相关,我不知道如何解释它 vector
.
我也不确定在文档中的何处阅读有关此问题的信息。我在 Mat
的 docs 中找到了以下语句,但这对解决我的问题没有太大帮助:
type – Array type. Use CV_8UC1
, ..., CV_64FC4
to create 1-4 channel
matrices, or CV_8UC(n)
, ..., CV_64FC(n)
to create multi-channel (up to
CV_CN_MAX
channels) matrices.
Update:上面说type
其实是一个数组类型,但是这是什么意思呢?我怎样才能使我的 vector<double>
获得使用 adaptiveThreshold
所需的类型 CV_8UC1
?
另一个更新:
阅读 O'Reilly 的 Learning OpenCV 一书后,我了解到以下内容:
type
can be any of a long list of predefined types of the form:
CV_<bit_depth>(S|U|F) C<number_of_channels>
. Thus, the matrix could
consist of 32-bit floats (CV_32FC1
), of un-signed integer 8-bit
triplets (CV_8UC3
), or of countless other elements.
所以,很明显,在我的例子中,vector<double>
不是 CV_8UC1
类型,因为 double
显然不是 _unsigned 8-bit integer
。但是,我可以将我刚刚做的这些值标准化。结果是 vector<int>
,其值仅介于 0
和 255
之间。因此,它应该是 CV_8UC1
类型,对吗?但是,我仍然遇到同样的错误...
类型不匹配。 int
和 unsigned char
是不同的。尝试将 vector<int>
转换为 vector<unsigned char>
然后它应该可以工作。
我想使用 OpenCV 中的 adaptiveThreshold
函数,它在 documentation 中定义如下:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
我不想使用 Mat
作为输入,而是想使用 vector<double>
。这应该是可能的,因为我在 documentation:
When you see in the reference manual or in OpenCV source code a function that takes
InputArray
, it means that you can actually passMat
,Matx
,vector<T>
etc. (see above the complete list).
我正在使用以下代码:
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 Error: Assertion failed (
src.type() == CV_8UC1
) inadaptiveThreshold
, file /Users/nburk/Developer/SDKs/opencv-2.4.10/modules/imgproc/src/thresh.cpp, line 796
libc++abi.dylib
: terminating with uncaught exception of typecv::Exception
: /Users/nburk/Developer/SDKs/opencv-2.4.10/modules/imgproc/src/thresh.cpp:796: error: (-215)src.type() == CV_8UC1
in functionadaptiveThreshold
现在,我明白调用失败是因为输入的 type
实际上不是 CV_8UC1
。但我不知道如何解决这个问题。我以为 type
属性 只与 Mat
对象相关,我不知道如何解释它 vector
.
我也不确定在文档中的何处阅读有关此问题的信息。我在 Mat
的 docs 中找到了以下语句,但这对解决我的问题没有太大帮助:
type – Array type. Use
CV_8UC1
, ...,CV_64FC4
to create 1-4 channel matrices, orCV_8UC(n)
, ...,CV_64FC(n)
to create multi-channel (up toCV_CN_MAX
channels) matrices.
Update:上面说type
其实是一个数组类型,但是这是什么意思呢?我怎样才能使我的 vector<double>
获得使用 adaptiveThreshold
所需的类型 CV_8UC1
?
另一个更新: 阅读 O'Reilly 的 Learning OpenCV 一书后,我了解到以下内容:
type
can be any of a long list of predefined types of the form:CV_<bit_depth>(S|U|F) C<number_of_channels>
. Thus, the matrix could consist of 32-bit floats (CV_32FC1
), of un-signed integer 8-bit triplets (CV_8UC3
), or of countless other elements.
所以,很明显,在我的例子中,vector<double>
不是 CV_8UC1
类型,因为 double
显然不是 _unsigned 8-bit integer
。但是,我可以将我刚刚做的这些值标准化。结果是 vector<int>
,其值仅介于 0
和 255
之间。因此,它应该是 CV_8UC1
类型,对吗?但是,我仍然遇到同样的错误...
类型不匹配。 int
和 unsigned char
是不同的。尝试将 vector<int>
转换为 vector<unsigned char>
然后它应该可以工作。