快捷搜索:  汽车  科技

pycharm怎么求矩形的面积(Cmemcpy的用法大数据传输与获取)

pycharm怎么求矩形的面积(Cmemcpy的用法大数据传输与获取)假设我们有1000张100*100的灰度图像,那么我们如何将这些数据拷贝到指定的目标中呢?具体如下因为参数是void*类型,所以可以将其他任意的类型转换为void*类型,但是拷贝的大小会受到_Size的控制。_Dst:新缓冲区。_Src:复制的缓冲区。_Size:要复制的字节数。

一、memcpy相关用法

C memcpy函数的用法比较简单,memcpy拷贝数据的时候,只需要传递拷贝数据的指针(4个字节)以及需要拷贝数据的大小就可以了。但是如何进行大数据的拷贝呢?以及如何拷贝若干份相同的数据(例如1000张图像)呢?

首先memcpy的原型如下:

void* memcpy(void* _Dst const void* _Src size_t _Size);

参数详解:

_Dst:新缓冲区。

_Src:复制的缓冲区。

_Size:要复制的字节数。

因为参数是void*类型,所以可以将其他任意的类型转换为void*类型,但是拷贝的大小会受到_Size的控制。

假设我们有1000张100*100的灰度图像,那么我们如何将这些数据拷贝到指定的目标中呢?具体如下

1、将若干份图像数据拷贝到指定目标中

// 申请需要开辟的目标缓冲区的大小 const int ImageSize = 100 * 100; const int ImageNums = 1000; char* pData = new char[ImageNums * ImageSize ]; // 1000张100*100的灰度图像 int index = 0; for(int i = 0; i < ImageNums ; i ) { // 假设图像的数据从文件中读取 CString strImagePath; strImagePath.Format("imageData%d" i); Mat src = imread(strImagePath 0); // 灰度图像加载 大小为100*100 // 将图像数据拷贝到指定的缓冲区中 memcpy(pData index src.data ImageSize); index = ImageSize; } // 处理完之后,对pData做相应的处理之后,释放所开辟的空间 delete[] pData; pData = NULL;

2、将指定目标中的数据读取出来,拆分为一张张图像(1中是将所有的图像存到指定的缓存中,那么我们如何从缓存中取出每一张图像呢)

// 申请需要开辟的目标缓冲区的大小 const int ImageSize = 100 * 100; const int ImageNums = 1000; char* pData = new char[ImageNums * ImageSize ]; // 1000张100*100的灰度图像 int index = 0; for(int i = 0; i < ImageNums ; i ) { // 假设图像的数据从文件中读取 CString strImagePath; strImagePath.Format("imageData%d" i); Mat src = imread(strImagePath 0); // 灰度图像加载 大小为100*100 // 将图像数据拷贝到指定的缓冲区中 memcpy(pData index src.data ImageSize); index = ImageSize; } //////////////////////////////////////////////////////////////// // 上述将1000张图像存入指定的缓存中,那么我们如何将图像取出来呢 index = 0; for(int i = 0; i < ImageNums ; i ) { Mat dst(100 100 CV_8UC1); // 创建图像 memcpy(dst.data pData index ImageSize); index = ImageSize; // 已经将图像数据拷贝到指定图像中了 // 接下来对图像做相关的处理 } // 释放指针 delete[] pData; pData = NULL;

其实图像数据也可以替换成其他任意类型的数据,如结构体等。

二、我所踩过的一些坑

假设我现在需要传递两个float的数据,但是我们函数上面是中char*指针传递的,代码如下

pycharm怎么求矩形的面积(Cmemcpy的用法大数据传输与获取)(1)

但是最终的结果不正确,它的结果是0,那么原因在哪里呢?

虽然我们传递参数的时候将float类型的指针转换为char*类型的指针,但是一个float占四个字节,而一个char占一个字节,所以问题就处在char* data这里,data[0]占一个字节,data[1]占一个字节,而传过来的是两个float,即八个字节,但是我们只使用了八个字节的前两位,即data[0],data[1]。

那么我们该如何修改呢?

fdata[0] = data[0]; // 将data[0]赋值给第一个float fdata[1] = data[1]; // 将data[1]赋值给第二个float 替换为 memcpy((char*)fdata data sizeof(float)*2);

使用memcpy进行拷贝操作,将8个字节全部拷贝进来就OK了。

猜您喜欢: