有效展平结构阵列 < >我正在寻找一种最有效的方法来扁平化C++中的一组结构,将FLCATED 1D数组数据作为输入输入到 CV::MAT。结构如下所示: struct Color3 { uint8_t red, green, blue; }

有效展平结构阵列 < >我正在寻找一种最有效的方法来扁平化C++中的一组结构,将FLCATED 1D数组数据作为输入输入到 CV::MAT。结构如下所示: struct Color3 { uint8_t red, green, blue; },c++,arrays,opencv,vector,C++,Arrays,Opencv,Vector,我的代码如下所示: // 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

我的代码如下所示:

// 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();

但是,我得到了以下错误:不能将
Color3*
类型的值分配给
uchar*
类型的实体,您不需要中间向量。 如果我理解的话,您希望为所有数据指定相同的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;
  }
uchar*data=colorMat.data;
对于(int i=0;i<1920*1080;++i)
{
*数据+=(uchar)彩色PTR->红色;
*数据+=(uchar)彩色PTR->绿色;
*数据+=(uchar)颜色PTR->.蓝色;
}

以下答案在技术上不可移植,但适用于现实生活中遇到的绝大多数平台

极有可能您的
Color3
结构没有填充。您可以通过使用
静态断言来实现这一点:

static_assert(sizeof(Color3) == sizeof(uint8_t) * 3);
确认后,您可以将
Color3
数组强制转换为
uint8\u t
数组,并将其直接传递给
colorMat.data
(假设该成员实际接受
uint8\u 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::Mat colorMat=cv::Mat::zero(cv::Size(19201080),cv_8UC3)
const Color3*colorPtr=colorFrame->getData();//从库中获取框架
colorMat.data=重新解释铸件(colorPtr);
请记住,我从未使用过
cv
库,对数据指针的所有权要求一无所知。以上只是复制了您正在做的事情,而没有不必要的
std::vector

data.reserve(1920*1080*3);你是说colorMat.data.reserve吗?
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);