我正在尝试使cv::Mat_
与我的自定义DataType
一起工作,但是我在使cv::Mat_::forEach
循环工作时遇到了一些问题。
我发现DataType文档并不令人满意,例如我想知道这些value_type
,work_type
,channel_type
enum
的内容和内容的使用而无需深入研究源代码,如果有人也对它们进行了解释,将非常高兴。我认为问题源于我对这些枚举的目的和用法缺乏理解。
以下是该问题的最小工作示例:
#include <opencv2\opencv.hpp>
class Bitflags
{
private:
ushort mFlags;
public:
enum Flag : ushort
{
Flag1 = 0x0001,
Flag2 = 0x0002,
Flag3 = 0x0004
//...
};
void Set(Flag flag)
{
mFlags |= flag;
}
};
template<>
class cv::DataType<Bitflags>
{
public:
typedef Bitflags value_type;
typedef Bitflags work_type;
typedef Bitflags channel_type;
enum
{
depth = CV_16U,
channels = 1,
type = CV_16U
};
};
struct Operator
{
void operator()(Bitflags &bitflags, const int * position) const
{
bitflags.Set(Bitflags::Flag::Flag1);
}
};
int main(int argc, char* argv[])
{
cv::Mat_<Bitflags> test = cv::Mat_<Bitflags>::zeros(10, 10);
// Error:
// no instance of overloaded function "cv::Mat_<_Tp>::forEach [with _Tp=Bitflags]" matches the argument list
test.forEach<Bitflags>(Operator());
// Same Error:
// no instance of overloaded function "cv::Mat_<_Tp>::forEach [with _Tp=Bitflags]" matches the argument list
test.forEach<Bitflags>(
[](Bitflags &bitflags, const int *pos) -> void {
bitflags.Set(Bitflags::Flag::Flag1);
}
);
// Fine
test(1, 1).Set(Bitflags::Flag::Flag1);
std::cout << test << std::endl;
return 0;
}