用户的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