xianyubbt 发表于 2023-8-22 13:41:27

memcpy复制数组数据不正确求解?

#include "opencv2/opencv.hpp"
#include <iostream>

// ...

STDMETHODIMP SampleCB(double Time, IMediaSample *pSample) {
    if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
      return S_OK;

    HRESULT hr = pSample->GetPointer(&ptrBuffer);
    if (hr == S_OK) {
      latestBufferLength = pSample->GetActualDataLength();
      if (latestBufferLength == numBytes) {
            EnterCriticalSection(&critSection);

            // 使用OpenCV进行缩放
            cv::Mat frame(1080, 1920, CV_8UC3, ptrBuffer); // 创建输入帧
            cv::Mat resizedFrame;
            cv::resize(frame, resizedFrame, cv::Size(320, 240), 0, 0, cv::INTER_LINEAR); // 缩放到320*240

            // 将缩放后的帧复制到pixels数组
            memcpy(pixels, resizedFrame.data, resizedFrame.total() * resizedFrame.elemSize());

            newFrame = true;
            freezeCheck = 1;

            LeaveCriticalSection(&critSection);
            SetEvent(hEvent);
      }
      else {
            printf("ERROR: SampleCB() - buffer sizes do not match\n");
      }
    }

    // ...
}
resizedFrame.data的数组数据复制到pixels数组不正确,resizedFrame数据正常,复制到pixels数组的数据显示不正确求解?

isdkz 发表于 2023-8-22 13:41:45

问题可能出在对 memcpy 函数的使用上。 memcpy 函数用于将一个内存块的数据复制到另一个内存块,但是它只是简单地按字节进行复制,并不会考虑数据类型和内存布局的差异。

在这个问题中, resizedFrame.data 是一个指向图像数据的指针,而 pixels 是一个数组。这两者的数据类型可能不同,导致复制的结果不正确。

解决这个问题的方法是使用 cv::Mat 的 copyTo 函数,它可以确保正确地复制数据并处理数据类型的差异。

以下是修改后的代码示例:

// 将缩放后的帧复制到pixels数组
cv::Mat resizedFrameCopy;
resizedFrame.copyTo(resizedFrameCopy);
memcpy(pixels, resizedFrameCopy.data, resizedFrameCopy.total() * resizedFrameCopy.elemSize());


通过先将 resizedFrame 复制到 resizedFrameCopy ,再使用 memcpy 函数复制 resizedFrameCopy.data 的数据到 pixels 数组,可以确保数据类型和内存布局的一致性,从而解决复制数据不正确的问题。

希望能帮助到您!如果还有其他问题,请随时提问。

陶远航 发表于 2023-8-22 13:42:21

从您提供的代码中,我注意到您正在使用OpenCV来缩放图像并将其复制到名为pixels的数组中。在这种情况下,由于数据显示不正确,可能会出现以下一些常见问题和解决方法:

1. **数据类型不匹配**: 确保pixels数组的数据类型与resizedFrame.data的数据类型匹配。根据您定义的CV_8UC3,resizedFrame.data应该是3通道、每个通道为8位无符号整数类型(uchar)的数据。确保pixels数组也具有相同的数据类型。

2. **数组尺寸不匹配**: 确保pixels数组具有足够的空间来存储resizedFrame.data的数据。可以通过比较pixels数组的大小和resizedFrame.total() * resizedFrame.elemSize()的值来检查是否匹配。resizedFrame.total()返回图像中像素的总数,resizedFrame.elemSize()返回每个像素的大小(以字节为单位)。

3. **内存访问错误**: 确保pixels数组的内存足够被访问,并且指针没有指向无效的内存地址。请确保在调用memcpy之前,已经为pixels数组分配了足够的内存空间。

另外,请确保您的代码中没有其他逻辑错误或数据处理问题。如果上述解决方法都无效,我建议您仔细检查代码的其他部分,尤其是涉及到图像数据处理和复制的相关逻辑,以确定问题的根本原因。

最后,如果问题仍然存在,我建议您提供更多的代码细节以及问题的具体表现,这样可以更好地帮助我们理解和解决您遇到的问题。
如果问题已经解决,请设置最佳答案

琅琊王朝 发表于 2023-8-22 21:35:33

根据您提供的代码,问题可能出现在将 resizedFrame.data 复制到 pixels 数组时出现了错误。

首先,请确保 pixels 数组的大小足够容纳 resizedFrame 的数据。根据代码中的注释,似乎 pixels 数组应该是一个一维字节数组,用于存储缩放后的图像数据。请确保 pixels 数组已经正确地分配了足够的内存空间。

其次,要将 resizedFrame.data 复制到 pixels 数组,可以使用 memcpy 函数,但需要确保复制的字节数是正确的。根据代码中创建的 cv::Mat 对象,resizedFrame.total() * resizedFrame.elemSize() 可以用来计算要复制的字节数。这个表达式中,resizedFrame.total() 返回像素的数量,resizedFrame.elemSize() 返回每个像素的字节数。

请检查一下 pixels 数组的大小是否正确,并确保 memcpy 函数中复制的字节数是准确的。另外,请确保在复制数据之前,resizedFrame 对象中的数据已经被正确地加载和处理。

如果问题仍然存在,并且无法确定出错的具体原因,请提供更多相关的代码和错误信息,以便进一步帮助您解决问题。
页: [1]
查看完整版本: memcpy复制数组数据不正确求解?