【发布时间】:2026-01-07 06:00:01
【问题描述】:
我想将 SVG 图形转换为 OpenCV Mat 对象。因此,SVG 图形被加载到一个 QSvgRenderer 对象中,然后转换为一个 QImage 对象,我使用它的原始数据创建我的最终 Mat 对象:
void scaleSvg(const cv::Mat &in, QSvgRenderer &svg, cv::Mat &out)
{
if (!svg.isValid())
{
return;
}
QImage image(in.cols, in.rows, QImage::Format_ARGB32);
// Get QPainter that paints to the image
QPainter painter(&image);
svg.render(&painter);
std::cout << "Image byte count: " << image.byteCount() << std::endl;
std::cout << "Image bits: " << (int*)image.constBits() << std::endl;
std::cout << "Image depth: " << image.depth() << std::endl;
uchar *data = new uchar[image.byteCount()];
memcpy(data, image.constBits(), image.byteCount());
out = cv::Mat(image.height(), image.width(), CV_8UC4, data, CV_AUTOSTEP);
std::cout << "New byte count: " << out.size() << std::endl;
std::cout << "New depth: " << out.depth() << std::endl;
std::cout << "First bit: " << out.data[0] << std::endl;
}
不幸的是,将生成的对象写入文件时出现“内存访问冲突”错误:
std::cout << (int*)out.data << std::endl; // pointer can still be accessed without errors
cv::imwrite("scaled.png", out); // memory access error
正在写入的文件大小不超过 33 个字节(仅标题数据??)。 在互联网上有一些关于 cv::Mat 指针所有权的解释,我认为它会在最后一次引用它之后被释放,因为“out”是一个引用,所以不应该是这种情况。顺便提一句。将 SVG 转换为 cv::Mat 的另一种方法总是受欢迎的。由于 OpenCV 似乎不支持 SVG,这看起来是一种简单的方法来完成它。
【问题讨论】: