Пользовательский тип данных в OpenCV's Mat_ - PullRequest
0 голосов
/ 23 октября 2018

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