gpt4 book ai didi

c++ - 用户自定义类型的 OpenCV 矩阵

转载 作者:可可西里 更新时间:2023-11-01 18:37:14 25 4
gpt4 key购买 nike

有没有办法在 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;

感谢您的帮助。

最佳答案

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

您将需要专门化 DataType 模板,但不是只有 1 个 channel ,而是使 channel 与自定义对象的大小相同。您可能还需要重写一些函数以获得预期的功能,但稍后再谈。

首先,这是我的自定义类型模板特化的示例:

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 的可读性。请注意,我已经用宽度/高度参数覆盖了构造函数。这是因为如果我们想要一个 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));
}

关于c++ - 用户自定义类型的 OpenCV 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com