2016-10-25 144 views
1

我試圖複製sf::RenderTexture(與sf::Image & sf::Text就可以了),以Opencv Mat對象。我們可以通過將RenderTexture複製到圖像

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); 

轉換的sf::Imagecv::Mat(opencv的)據我所知,在SFML我們不能添加文本直接sf::Image但我們必須使用RenderWindow的或渲染紋理爲。我想唯一的解決方法是加載在下列順序

SF ::圖片對象 - > SF ::紋理 - > SF ::雪碧 - > SF ::渲染紋理

SF ::文本 - > SF ::渲染紋理

最後複製渲染紋理順豐::圖像,然後將其轉換爲CV ::墊
我想這將需要很長時間才能複製回SF ::渲染紋理順豐::圖片。

其他解決方法?像使用sf :: Image :: loadFromMemory();

P.S:一些參考here & here

回答

1

沒有,是不是一個真正的替代,當談到SFML。從VRAM複製到RAM並不是很快,但應該仍然能夠以好的幀率執行。也許你應該嘗試一下,看看性能是否真的影響你的情況。

這裏的問題是SFML在GPU空間中運行,所以文本渲染是用GPU渲染類似的東西與精靈,但實際上你想要的是CPU渲染文本和精靈。

如果你只是翻譯精靈(沒有縮放/旋轉),在sf::Image之上建立這樣的功能應該相對容易。

對於文本渲染,您可能希望直接使用freetype而不將字體數據移動到GPU。

+0

感謝您的回答。你可以詳細闡述一下_「你可能想直接使用freetype並且不把字體數據移動到GPU上」_ –

+1

Freetype是一個用於加載和渲染字體的庫。 SFML在內部使用freetype,然後將呈現的字符作爲sf :: Textures上傳到GPU。既然你想要一個「軟件」渲染器,你可以自己使用freetype,然後渲染到「RAM」。你如何做到這一點,超出了這個問題。 – Lukas