从std :: basic_string <char>中编写cv :: Mat图像

时间:2017-12-19 07:37:59

标签: c++ opencv

我正在尝试从cv::Mat撰写std::basic_string<char>图像,但合成图像为空。以下是代码段:

std::basic_string<char> color_pixels = color_frame.data();
cv::Mat image(cv::Size(color_frame.width(), color_frame.height()),
              CV_8UC4,
              &color_pixels,
              cv::Mat::AUTO_STEP);

在继续进行之前,我想验证数据。因此,我检查了widthheight等,发现是正确的。

std::cout << "width:" << color_frame.width() <<
          ", height:" << color_frame.height() << 
          ", length:" <<  color_pixels.length() << std::endl;
width:1920, height:1080, length:8294400 // 1920 * 1080 * 4 = 8294400

我发现了一个类似的问题here,并试图在我的代码中实现如下:

cv::Mat image(cv::Size(color_frame.width(), color_frame.height()),
              CV_8UC4,
              color_pixels.data(),
              cv::Mat::AUTO_STEP);

不幸的是,它引发了以下错误:

error: invalid conversion from ‘const void*’ to ‘void*’

如何从std :: basic_string撰写cv :: Mat图像?有任何解决方法吗?

2 个答案:

答案 0 :(得分:1)

color_pixels.data()是一个const值。

http://en.cppreference.com/w/cpp/string/basic_string/data

答案 1 :(得分:1)

在C ++中,void*可用于表示指向某个未指定的有效内存地址的指针(在内部,这将被传递给某些低级API,如C memcpy,或者转换为某种有意义的类型根据给定的接口合同)。恕我直言,这在现代C ++类型系统中很少有必要(处理内存的函数现在可以使用std :: byte),但使用它的C ++库仍然存在。

无论如何,回到你的问题,你可以隐式地将任何指针转换为void *,但你不能暗示抛弃constness。您需要const_cast

cv::Mat image(cv::Size(color_frame.width(), color_frame.height()),
              CV_8UC4,
              const_cast<char*>(color_pixels.data()),
              cv::Mat::AUTO_STEP);

一些警告:

  • 在&gt; = C ++ 11中,如果color_pixels最初是const,那么任何通过color_pixels修改image数据的尝试都会导致未定义的行为< / EM>

  • 在C ++&lt; = 03中,data()不需要指向原始字符串字符,因此任何修改尝试在这种情况下都是UB。 / p>

  • 调用color_pixels修饰符使其内容无效也会调用大多数图像方法UB。