将 MAT 图像复制到 C++ 中的特定地址
Posted
技术标签:
【中文标题】将 MAT 图像复制到 C++ 中的特定地址【英文标题】:Copying a MAT image to specific address in c++ 【发布时间】:2018-03-21 12:24:18 【问题描述】:我正在尝试将从文件中加载的 MAT 图像复制到特定地址位置。我有以下代码
int main()
cv::Mat inImg = cv::imread("M6_traffic.jpg");
//Data point copy
unsigned char * pData = (unsigned char *)inImg.data;
unsigned char * Dest = (unsigned char *)0x0f000000;;
int width = inImg.rows;
int height = inImg.cols;
//data copy using memcpy function
memcpy(Dest, pData, sizeof(unsigned char)*width*height*3);
但是当我运行它时它总是崩溃,知道为什么吗?有更好的理由吗?我的最终目标是能够将图像数据复制到基于 Linux 的系统中的特定地址
【问题讨论】:
您应该添加崩溃的详细信息、给出的错误等。它在哪一行崩溃?您错过了许多有助于回答您的问题的细节。我建议阅读this 并修改您的问题 “我的最终目标是能够将图像数据复制到基于 Linux 的系统中的特定地址” 为什么?这是我认为需要更多背景知识的另一个领域。您的系统是否允许您复制到该地址?大多数现代操作系统不允许将数据填充到内存中的任意地址。 ... 这就是你崩溃的原因。 除了上面所说的一切,请注意,cols 是图像的宽度,rows 是图像的高度。这通常对复制并不重要,但可能对复制后使用图像很重要。您的代码中还有另一个问题。不能保证图像是连续的。例如,出于优化原因,图像可能在每行的末尾有一个填充。您应该确保图像是连续的(例如,通过调用 .clone() 和/或测试 .isContinuous)。 【参考方案1】:可能在地址 0x0f000000 上没有分配内存。 并且你不能强制这是一个有效的地址
使用 malloc 分配正确大小的内存,它将起作用。 操作系统然后确定您的地址空间并返回一个指向它的指针。
unsigned char* Dest = malloc(sizeof(pData));
memcpy(Dest, pData, sizeof(pData))
【讨论】:
所以通过这样做 unsigned char * Dest = (unsigned char )0x0f000000;; Dest = (unsigned char *)malloc(sizeof(unsigned char)*widthheight*3);操作系统会将 Dest 分配给第二行的不同地址?我正在尝试将数据复制到特定的虚拟地址,我知道该地址与我需要在某些 FPGA 逻辑中使用的物理地址相匹配,有没有办法做到这一点?【参考方案2】:0x0f000000 本质上是一个空指针。您要做的是将数据复制到尚未使用memcpy(Dest, pData, sizeof(unsigned char)*width*height*3);
设置的内存地址中。
您应该在memcpy
语句之前为Dest
分配内存。您可以使用malloc
或calloc
执行此操作。这些函数调用在以下链接中进行了描述。希望这会有所帮助!
http://en.cppreference.com/w/c/memory/malloc
http://www.cplusplus.com/reference/cstdlib/calloc/
【讨论】:
以上是关于将 MAT 图像复制到 C++ 中的特定地址的主要内容,如果未能解决你的问题,请参考以下文章
将 Vector<float> 中的数据复制到 Vector<Mat> (Opencv/C++)