繁体   English   中英

OpenCV:将图像转换为C ++数组

[英]OpenCV: Convert an image to C++ array

我想在opencv中读取3通道RGB图像,并将其转换为线性C ++浮点数组。 听起来很简单,但我仍在努力。 我用这段代码尝试了一下,但是由于某种原因,它给了我segmentation fault

  cv::Mat rgb_image;
  cv::imread(filename.c_str(), cv::IMREAD_COLOR).convertTo(rgb_image,  CV_32FC3, (1./255.));

  float *rgb_data = new float(rgb_image.rows * rgb_image.cols * rgb_image.channels());
  int counter = 0;
  for (int z = 0; z < rgb_image.channels(); z++)
    for (int i = 0; i < rgb_image.rows; i++)
      for (int j = 0; j < rgb_image.cols; j++){
        rgb_data[counter] = rgb_image.at<cv::Vec3f>(i,j)[z] ;
        counter++;
      }

有人看到出什么问题了吗?
有更简单的方法吗?
我知道有将cv::Mat转换为std::vector stackoverflow-examples ,对于C ++数组可能会有类似的可能吗? 输出尺寸应为[Rows x Cols x Channel]

您有两个问题:

  1. 由rafix07指向:使用[]代替()

  2. rgb_image.at(i,j)[z]给出3个浮点而不是1个

我建议使用std :: memcpy

float *rgb_data = new float(rgb_image.rows * rgb_image.cols * rgb_image.channels()); // Dst
float* dataPointer = reinterpret_cast<float*>(rgb_image.data); // Src
// pointer from, pointer two, size in bytes
std::memcpy(rgb_data, dataPointer, rgb_image.rows * rgb_image.cols * rgb_image.channels() * sizeof(float));

它是经过优化的,并且可能比循环要好:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM