将 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 分配内存。您可以使用malloccalloc 执行此操作。这些函数调用在以下链接中进行了描述。希望这会有所帮助!

http://en.cppreference.com/w/c/memory/malloc

http://www.cplusplus.com/reference/cstdlib/calloc/

【讨论】:

以上是关于将 MAT 图像复制到 C++ 中的特定地址的主要内容,如果未能解决你的问题,请参考以下文章

openCV中的mat动画

将 Vector<float> 中的数据复制到 Vector<Mat> (Opencv/C++)

如何将 Mat 的矩形区域复制到相同大小的新 Mat?

试图将 cv::Mat 数据复制到 uchar *

如何将具有特定大小的字符复制到另一个图像中与原始图像相同的位置?

iOS - 将特定图像从捆绑资源路径复制到 Documents Dir