将 RenderTexture 复制到图像

Copy RenderTexture to Image

我正在尝试将 sf::RenderTexture(上面有 sf::Imagesf::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::Texture --> sf::Sprite -->sf::RenderTexture

sf::Text --> sf::RenderTexture

最后将 RenderTexture 复制到 sf::Image 然后将其转换为 cv::Mat
我想将 sf::RenderTexture 复制回 sf::Image 需要很长时间。

还有其他解决方法吗?比如使用 sf::Image::loadFromMemory();

P.S: 一些引用 here & here

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

这里的问题是 SFML 在 GPU 中运行 space,所以文本渲染是为了用你的 GPU 渲染,类似于精灵,但你实际上想要的是 CPU 渲染文字和精灵。

如果您只翻译 sprites(没有 scaling/rotating),那么在 sf::Image 之上构建此类功能应该相对容易。

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