痛点
某些厂家的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在内存中的展开排布方式,按行展开)