用户的OpenCV矩阵

有没有办法在OpenCV 2.x中拥有用户定义类型的矩阵? 就像是 :

cv::Mat_<KalmanRGBPixel> backgroundModel;

我知道cv :: Mat <>是用于图像和数学,但我想以矩阵形式保存数据。 我不打算使用反转,转置,乘法等等,它只是存储数据。 我希望它是矩阵形式,因为每个视频帧的pixel_ij都会链接到backgroundModel_ij。

我知道core.hpp中有一个DataType <_Tp>类需要为我的类型定义,但我不知道该怎么做。

编辑: KalmanRGBPixel只是cv :: KalmanFilter类的包装。 至今为止,它是唯一的成员。

... some functions ...
private:
    cv::KalmanFilter kalman;

谢谢你的帮助。


在OpenCV文档中,解释了如何将自定义类型添加到OpenCV矩阵。 你需要定义相应的cv::DataType

https://docs.opencv.org/master/d0/d3a/classcv_1_1DataType.html

DataType类基本上用于提供这些原始数据类型的描述,而不向相应的类添加任何字段或方法(实际上不可能向原始C / C ++数据类型添加任何内容)。 这种技术在C ++中被称为类特征。 它不是使用数据类型本身,而是使用其专用版本[...]该类的主要目的是将编译时类型信息转换为兼容OpenCV的数据类型标识符

(是的,最后我在这个主题中回答了问题本身!)


对于想要创建任意大小的自定义对象矩阵的任何人,我都有一个更长的回答。

您需要专门化DataType模板,但不要使用1个通道,而是使通道的大小与您的自定义对象的大小相同。 您可能还需要重写一些函数才能获得预期的功能,但稍后会回到该功能。

首先,这里是我的自定义类型模板特化的一个例子:

typedef HOGFilter::Sample Sample;
namespace cv {
    template<> class DataType<Sample>
    {
    public:
        typedef HOGFilter::Sample       value_type;
        typedef HOGFilter::Sample       channel_type;
        typedef HOGFilter::Sample       work_type;
        typedef HOGFilter::Sample       vec_type;

        enum {
            depth = CV_8U,
            channels = sizeof(HOGFilter::Sample),
            type = CV_MAKETYPE(depth, channels),
        };
    };
}

第二..你可能想重写一些函数来获得预期的功能:

// Special version of Mat, a matrix of Samples. Using the power of opencvs
// matrix manipulation and multi-threading capabilities 
class SampleMat : public cv::Mat_<Sample>
{
    typedef cv::Mat_<Sample> super;
public:
    SampleMat(int width = 0, int height = 0);
    SampleMat &operator=(const SampleMat &mat);

    const Sample& at(int x, int y = 0);
};

super的typedef不是必需的,但有助于提高cpp的可读性。 注意我已经用width / hight参数覆盖了构造函数。 这是因为如果我们想要一个2D矩阵,我们必须以这种方式实例化矩阵。

SampleMat::SampleMat(int width, int height)
{
    int count = width * height;

    for (int i = 0; i < count; ++i)
    {
        HOGFilter::Sample sample;
        this->push_back(sample);
    }

    *dynamic_cast<Mat_*>(this) = super::reshape(channels(), height);
}

at <_T>()覆盖仅用于更简洁的代码:

const Sample & SampleMat::at(int x, int y)
{
    if (y == 0)
        return super::at<Sample>(x);

    return super::at<Sample>(cv::Point(x, y));
}

如果你不想使用OpenCV功能,那么Mat不适合你。 改为使用std::vector<std::vector<Type> > 。 你可以在初始化时给出大小:

std::vector<std::vector<Type> > matrix(42, std::vector<Type>(23));

然后你可以使用[] -operator进行访问。 不需要在这里使用隐藏的cv::Mat s。

如果你真的需要去一个OpenCV矩阵,你是对的,你必须定义数据类型。 这基本上是一堆特质。 你可以阅读关于网络上的C ++ Traits。

链接地址: http://www.djcxy.com/p/54619.html

上一篇: OpenCV Matrix of user

下一篇: WCF Certificate Chain, verify programmatically