我尝试将sf::RenderTexture
(包含sf::Image
& sf::Text
)复制到Opencv Mat对象。我们可以通过
sf::Image
转换为cv::Mat
(Opencv)
sf::Image img;
cv::Size size(img.getSize().x, img.getSize().y);
cv::Mat mat(size,CV_8UC4, (void*)img.getPixelsPtr(), cv::Mat::AUTO_STEP);
cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGRA);
据我所知,在SFML中我们无法直接向sf::Image
添加文本,但我们必须使用RenderWindow或RenderTexture。我想只有解决方法是按以下顺序加载对象
sf :: Image - > sf ::纹理 - > sf :: Sprite - > sf :: RenderTexture
sf :: Text - > SF ::渲染纹理
最后将RenderTexture复制到sf :: Image,然后将其转换为cv :: Mat
我想将sf :: RenderTexture复制回sf :: Image需要很长时间。
还有其他解决方法吗?比如使用sf :: Image :: loadFromMemory();
答案 0 :(得分:1)
不,在SFML方面没有其他选择。从VRAM复制到RAM的速度不是很快,但仍然能够以良好的帧速率执行。也许您应该尝试一下,看看性能是否真的会影响您的场景。
这里的问题是SFML在GPU空间中运行,因此文本渲染是为了使用与sprite类似的GPU渲染渲染,但实际上你想要的是文本和精灵的CPU渲染。
如果你只翻译精灵(没有缩放/旋转),那么在sf::Image
之上构建这样的功能应该相对容易。
对于文本渲染,您可能希望直接使用freetype而不是将字体数据移动到GPU。