我正在尝试从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);
在继续进行之前,我想验证数据。因此,我检查了width
,height
等,发现是正确的。
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图像?有任何解决方法吗?
答案 0 :(得分:1)
color_pixels.data()是一个const值。
答案 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。