将RenderTexture复制到图像

时间:2016-10-25 05:32:10

标签: c++ image opencv sfml deep-copy

我尝试将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();

P.S:一些参考文献here& here

1 个答案:

答案 0 :(得分:1)

不,在SFML方面没有其他选择。从VRAM复制到RAM的速度不是很快,但仍然能够以良好的帧速率执行。也许您应该尝试一下,看看性能是否真的会影响您的场景。

这里的问题是SFML在GPU空间中运行,因此文本渲染是为了使用与sprite类似的GPU渲染渲染,但实际上你想要的是文本和精灵的CPU渲染。

如果你只翻译精灵(没有缩放/旋转),那么在sf::Image之上构建这样的功能应该相对容易。

对于文本渲染,您可能希望直接使用freetype而不是将字体数据移动到GPU。