OpenCV 从 float* 数组构造 Mat

Posted

技术标签:

【中文标题】OpenCV 从 float* 数组构造 Mat【英文标题】:OpenCV Construct Mat from float* array 【发布时间】:2014-09-11 22:06:02 【问题描述】:

我正在尝试使用带有传入数据选项的 OpenCV Mat::Mat 构造函数。

我在这个论坛上读到,您可以将浮点指针传递给数组,但每次我这样做时,它都会尝试传递地址(我认为这是正在发生的事情)而不是来自大批。

我尝试了两种不同的方式来创建浮点数组:

float *outputimg = (float*)malloc(img1.rows*img1.cols*sizeof(float));

float *outputimg = (float*)malloc(img1.step*img1.elemSize());

然后我尝试了 Mat 构造函数如下:

Mat contrastimg(img1.rows, img1.cols, CV_32F, outputimg, img1.step);

Mat contrastimg(img1.rows, img1.cols, CV_32F, outputimg);

Mat contrastimg(img1.rows, img1.cols, CV_32F, outputimg, img1.cols*sizeof(float));

这些都不适合我。有什么想法吗?

【问题讨论】:

您的第二次尝试应该适用于第一个浮点数组...您如何测试它是否有效?!? Mat contrastimg(img1.rows, img1.cols, CV_32F, floatptr);是有效的。 【参考方案1】:

我认为,做你需要的最好的方法是首先 convert 指向 CvMat 矩阵的指针,然后 construct 来自它的 Mat 对象。它应该看起来像这样:

CvMat* m = new CvMat;
m->type = yourType;
m->data.fl = outputimg;
m->rows = img1.rows;
m->cols = img1.cols;

Mat matrix(m);

【讨论】:

稍微改进一下就是不使用new,直接创建CvMat m;,这样就不用冒泄露的风险,可以创建MatMat matrix(&m);。跨度>

以上是关于OpenCV 从 float* 数组构造 Mat的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ_3289_Mato的文件管理_莫队+树状数组

BZOJ3289Mato的文件管理 莫队算法+树状数组

3289. Mato的文件管理莫队+树状数组

bzoj3289Mato的文件管理 离散化+莫队算法+树状数组

BZOJ3289[JZYZOJP2018]: Mato的文件管理 莫队+树状数组+离散化

BZOJ 3289: Mato的文件管理[莫队算法 树状数组]