使用opencv快速复制大型float数组(一维)

痛点

        某些厂家的rv1126是buildroot文件系统,导致只能使用虚拟机交叉编译,这就使得像是eigen这个矩阵运算库不能被cmake正确配置(也可能是自己菜呜呜呜),项目中又需要复制数组即图像数据。

解决方式

这里的使用的方式是使用opencv的相关函数快速实现,代码如下:

#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

int main(int argc, char **argv)
{

    cv::Mat dest;
    float *p = (float *)calloc(1024*2048, sizeof(float));
    printf("location of p: %p\n", p);
    p[0] = 0; p[1] = 1; p[1] = 1; p[2] = 2; p[3] = 3; p[4] = 4;
    while(1)
    {
        float *p = (float *)calloc(1024*2048, sizeof(float));
        printf("location of p: %p\n", p);
        cv::Mat img(1024*2, 2048*2, CV_MAKETYPE(CV_8U, 1), (uchar * )p);

        printf("Address of num_ori: %p\n", img.data);
        dest = img.clone();
        printf("Address of num_aft: %p\n", dest.data);
        p = (float *)dest.data;
        // printf("1:%f 2:%f 3:%f 4:%f 5:%f", p[0], p[1], p[2], p[3], p[4]);
        free(img.data);
    }

    return 0;
}

==>内存管理:

1、对于自己分配的内存,即待复制的数组数据可能需要自己调用相关的内存释放函数,不然会内存泄漏,这里使用的是“free(img.data);”

2、对于复制后产生的内存块,即“dest.data”,当没有“cv::mat”的data指针指向它时候,会自动释放;(不是指针,这句可以证明,p = (float *)dest.data;)

3、cv::mat正常情况下的复制时浅复制

以后的工作

opencv有CV_32F的图像数据类型,也就是说,这里可以使用opencv的内置方法实现矩阵加法、乘法等

==>注意:

1、由于opencv的特性,其维度排列时hwc,我们一般习惯上时chw(这也是rv1126推理结果的排布),所以如果是多维数据的话要注意;(当然,对于逐点相加或相乘,可以将维度在y方向展开,当然此处的坐标是常见的左上原点的图像坐标形式,原理是opencv的data在内存中的展开排布方式,按行展开)

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值