Я пытаюсь заставить 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;
}