2016-10-25 3 views
1

私はOpencv Matオブジェクトにsf::Image & sf::Textとコピーすることを試みています。私たちは、SFMLに、我々はsf::Imageに直接テキストを追加することはできませんが、我々はそのためRenderWindowのか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); 

によってcv::Mat(OpenCVの)へsf::Imageを変換することができます。 > SF ::テクスチャ - - > SF ::スプライト - > SF :: RenderTexture

SF ::テキスト私は唯一の回避策は、注文

SF ::イメージの次のオブジェクトをロードすることであると思います - > SF :: SFにRenderTexture

最後にコピーRenderTexture ::画像その後、CVに変換::マット
私はそれがSFをコピーするために長い時間がかかるだろうと仮定::バックSFにRenderTexture ::画像。

この他の回避策はありますか? sf :: Image :: loadFromMemory();のようにします。

P.S:それはSFMLに来るときいくつかの参照here & here

答えて

1

ありませんが、本当に選択肢がありません。 VRAMからRAMへのコピーは非常に高速ではありませんが、まだOK-ishフレームレートで実行できるはずです。たぶん、試してみて、パフォーマンスが実際にあなたのシナリオに影響を与えるかどうかを確認する必要があります。

ここで問題となるのは、SFMLはGPU空間で動作するため、GPUでスプライトと同様のものをレンダリングするためにテキストレンダリングが行われますが、テキストとスプライトのCPUレンダリングが実際に必要なようです。

スプライトのみを変換(スケーリング/回転なし)する場合は、sf::Imageの上にそのような機能を構築するのは比較的簡単です。

テキストレンダリングでは、freetypeを直接使用し、フォントデータをGPUに移動したくない場合があります。

+0

あなたの答えをありがとう。 _ "あなたはフリースタイルを直接使用し、フォントデータをGPUに移動したくないかもしれません。" _ –

+1

Freetypeはフォントのロードとレンダリングに使用されるライブラリです。 SFMLはfreetypeを内部的に使用し、レンダリングされた文字をsf :: TexturesとしてGPUにアップロードします。 "ソフトウェア"レンダラが必要なので、あなた自身でfreetypeを使用して "RAM"にレンダリングすることができます。あなたはそれをどうやって、この質問を超えています。 – Lukas

関連する問題