【问题标题】:Copying OpenCV mat to a known address with memcpy使用 memcpy 将 OpenCV mat 复制到已知地址
【发布时间】:2020-07-25 21:28:45
【问题描述】:

我是 C++ 的新手,我正在尝试创建一个使用 OpenCV 库的DLL

我的DLL 从其他应用程序获取原始图像并从应用程序的内存缓冲区创建MAT。我将包含原始图像的缓冲区地址发送到DLL,并将原始图像发送到 OpenCV。这部分有效。 但是使用 OpenCV 处理图像后,我无法将原始图像写入相同的内存地址。

这是我尝试过的代码 sn-p:

fn_export double createImage(char* address  double width, double height) {
  
  unsigned char* pBuffer = (unsigned char*)address;
  memcpy(&pBuffer,&address, sizeof(pBuffer));
  cv::Mat img = cv::Mat(height,width, CV_8UC4, pBuffer);
  cv::imshow("Original", img);

  memcpy(&address, &img.data[0], sizeof(address));

  return 1;
}

char* address 是我的应用程序的内存地址。其他应用程序的缓冲区不会以这种方式改变。有人对这种情况有什么建议吗?

【问题讨论】:

  • 在 memcpy() 中,当您获取 sizeof(address) 时,这是不正确的,因为这只是复制指针而不是指针指向的位置的实际数据。 &address[0] 和 &address 也是一回事。
  • 感谢您的评论。是的你是对的。我意识到我的代码中的一些定义是不必要的。

标签: c++ opencv memcpy


【解决方案1】:

好的。我解决了这个问题;

    Mat img = Mat(height, width, CV_8UC4, address);
cv::imshow("Image from GM", img);
// same image copy to buffer back;
memcpy(&address[0], &img.data[0], width*height*4.);

【讨论】:

  • 从技术上讲,您应该先检查图像是否连续,然后再假设它是连续的,并且在不检查的情况下进行复制...stackoverflow.com/q/33665241/2836621
  • 将问题标记为已回答。
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 2018-09-19
  • 2014-09-19
相关资源
最近更新 更多