【问题标题】:Flatten array of structs efficiently有效地展平结构数组
【发布时间】:2018-12-01 00:15:47
【问题描述】:

我正在寻找在 C++ 中展平结构数组的最有效方法,以便将展平的一维数组数据作为输入传递给 cv::Mat。该结构如下所示:

struct Color3
{
    uint8_t red, green, blue;
}

我的代码如下所示:

// Update color frame
cv::Mat colorMat = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3)

const Color3* colorPtr = colorFrame->getData(); // Get Frame from Library
std::vector<uchar> vecColorData;
data.reserve(1920 * 1080 * 3);

for (int i = 0; i < 1920 * 1080; ++i)
{
     auto color = *colorPtr;
     vecColorData.push_back(color.red);
     vecColorData.push_back(color.green);
     vecColorData.push_back(color.blue);
     vecColorData++;
}

colorMat.data = vecColorData.data();

有没有比创建中间std::vector 并循环整个数组更有效的方法?我想我正在寻找类似的东西:

colorMat.data = colorFrame->getData()

但是,我收到以下错误:Color3* 类型的值无法分配给 uchar* 类型的实体。

【问题讨论】:

  • data.reserve(1920 * 1080 * 3);你是说 colorMat.data.reserve 吗?

标签: c++ arrays opencv vector


【解决方案1】:

您不需要中间向量。 如果我理解,您想为所有数据分配相同的 RGB 三元组。 我也不清楚您是否必须自己分配 colorMat.data 。 如果是这种情况,一旦 colorMat.data 被分配并且大小为 1920 * 1080 * 3,您可以执行以下操作:

  uchar * data = colorMat.data;
  for (int i = 0; i < 1920 * 1080; ++i)
  {
    *data++ = (uchar)colorPtr->red;
    *data++ = (uchar)colorPtr->green;
    *data++ = (uchar)colorPtr->.blue;
  }

【讨论】:

    【解决方案2】:

    以下答案在技术上是不可移植的,但可以在您在现实生活中遇到的绝大多数平台上运行。

    您的 Color3 结构极有可能没有填充。您可以使用static_assert 来验证这一点:

    static_assert(sizeof(Color3) == sizeof(uint8_t) * 3);
    

    确认后,您可以将 Color3 数组转换为 uint8_t 数组并将其直接传递给 colorMat.data(假设该成员实际接受 uint8_t)。

    因此您的代码变为:

    cv::Mat colorMat = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3)
    
    const Color3* colorPtr = colorFrame->getData(); // Get Frame from Library
    
    colorMat.data = reinterpret_cast<const uint8_t*>(colorPtr);
    

    请记住,我从未使用过 cv 库,并且对数据指针的所有权要求一无所知。以上只是复制了你正在做的事情,没有不必要的std::vector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2021-03-05
      • 2021-02-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多