OpenCV Mat_中的自定义数据类型

时间:2018-10-23 10:15:47

标签: opencv mat custom-data-type

我正在尝试使cv::Mat_与我的自定义DataType一起工作,但是我在使cv::Mat_::forEach循环工作时遇到了一些问题。

我发现DataType文档并不令人满意,例如我想知道这些value_typework_typechannel_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;
}

0 个答案:

没有答案