• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++/CLIで画像処理)

C++/CLIで画像処理

このQ&Aのポイント
  • VC 2010 C++/CLIで画像処理を行うためのライブラリを探しています。
  • 既存プロジェクトにグラフィック機能を追加するため、異なるサイズの画像を重ねて描画したり、画像の透過処理や変形を行いたいです。
  • 標準の機能やOpenCV、OpenGL、DXLib、GDI+、Direct2Dなどを試しましたが、それぞれのライブラリには制約や課題があります。どのライブラリが最適か教えていただけませんか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは。 全てを網羅的に知っている訳ではないので、どれが良いかなどには答えられませんが、コメントを。 【1. 標準機能】 > 画像データを変形毎に計算して求めるのは非現実的なので どの様なライブラリ・APIを使ったとしても、(プログラマーが意識しなくても) 内部的には変形された画像データを計算している事には変わりありません。従って、画像データを変形の度に計算する事自体に関しては非現実的とは思いません。ただ、実際的な問題として、コーディングの手間と計算時間があるかと思います。標準機能の範囲内で実現するとしたら、コーディングの手間は惜しまないとしても、計算時間が問題として残りそうではあります。 しかし、実測していないので usami99 さんの目的の計算で、どれくらいの時間になるかは分かりません。もしかすると無視できるぐらい時間が短いかもしれませんし、或いは非現実的に遅いかもしれません。ところで、計算時間を評価する上で以下の事は確認した方が良いです: 「変形対象の画像サイズが大きすぎないか?」 画像サイズが実際の表示に用いている物よりも大きい場合には、画像サイズを表示する大きさに縮小してから表示するべきです。計算時間は画像の面積(∝長さの二乗)に比例しますので。 因みに OpenCV, OpenGL, DXLib, (それから、もしその様な機能が在れば Direct2D も) では、GPU の機能を呼び出して変形を計算していると思われるので、愚直に計算するよりは格段に速いと予想されます。 この方法を採用する場合に考慮するべきは ★コーディングの手間 ★計算時間の評価 (過大評価しているかもしれないので、効率的な実装にしてから、実測) 【2. OpenCV】 使った事がないので分かりません。ただ、 > (視点の変更で形状こそ求めているものに近くなるが、 という事であれば、「どの様に視点を変更すれば目的の形になるか」を計算すれば良いのではないでしょうか。三次元の幾何学の計算(数式変形)が必要になると思いますが。 > ・透過処理がアルファブレンドなので、同サイズの… 何をしているのか良く分かりませんが、例えば、↓にある様な事をしようとしているという事でしょうか。 http://www3.pf-x.net/~chopper/home2/WinAPI/WinGDI21.html それならば、上記URLに書いてあるように、変形した後の余白に対応するマスク画像を生成すれば良いのではないでしょうか。 ★4点に対応する視点の計算方法が分かればする ★マスクは可能か? 【3. OpenGL】 余り使った事がないので分かりませんが… > 4の変形時にマッピング画像が追従するようにする必要がある 勘違いしているかも知れませんが、テクスチャ(及びポリゴン上の UV 座標)はそのままで、平面ポリゴンの方を傾けるのでは駄目なのでしょうか。この場合も 4 点に対応するテクスチャの傾け方を考える必要がありますが。 ★テクスチャの方を傾けるのは可能か? 【4. DXLib】 すみません分かりません。 DXLib は他の枠組と相互運用できない様に思われます。DXLib の上で UI を全て作り直すのであれば可能そうですが。 【5. GDI+】 他の方が回答されている様に C++/CLI との親和性は高いですが、4点を指定して画像を変形する機能は GDI+ にはないと思うのですが…(勘違いでしたら済みません)。 というのも、.NET Framework の System::Drawing は元々 Gdiplus のラッパーとして設計されているからです。従って、GDI+ と System::Drawing の親和性が高いのは、そもそも同一の物ですから当然です。そして、4点を指定して画像を変形する機能は GDI+ にないので、標準の機能 (.NET Framework System::Drawing) にもないのです。 > 同じ名称の物が有るたびに > 一つ一つ、動作確認しながらクラスの定義をしなくてはならず、難儀しています。 > > 回答No.2 なにか言葉を湾曲して捉えられていませんか? 質問者さんは「System::Drawing::Graphics と Gdiplus::Graphics を混同している」とか「CLI からうまく使えない」とかいうのではなくて、例えば、「その辺りにある解説サイトに登場する Graphics オブジェクトが Systen::Drawing::Graphics の事なのか Gdiplus::Graphics の事なのか解説サイトに明記されていない(or分かりにくい)」事を嘆いていられるのですよね。お気持ち分かります。 ★GDI+ は標準の機能とほぼ同等 【6. Direct2D】 これも知りませんが、Wikipedia によると GDI/GDI+ と相互運用できるとあるので、 System::Drawing::Graphics^ g の g->GetHdc() で得られる HDC に対して描画できるのではないでしょうか。 もしこれでできるのであれば、この方法が一番綺麗だと思われます。 サンプル (C++) http://code.msdn.microsoft.com/windowsapps/Direct2D-perspective-7db78f51 -------- 4点を指定して変換するという事が今回の鍵になると思うのですが、その辺りの経緯を分かり易くする為にも、過去の関連する質問へのリンクがあった方が良いかもしれません。 http://okwave.jp/qa/q8696755.html http://okwave.jp/qa/q8679117.html http://okwave.jp/qa/q8662361.html

usami33
質問者

お礼

ありがとうございます そうなんですよ、既に既知の部分でSystem::Drawing::Graphicsは多様しているので、 サンプルを見て、そんままGraphicsが流用できるかと思いきや、 サンプルはGdiplus::Graphicsだったり、 その逆で、あいまい表現のエラーを回避する為に態々Gdiplus::Graphics と明記すると 実はサンプルのGraphicsがSystem::Drawing::Graphicsだったり、 せめて、ヘッダもサンプルと一緒に公開してくれていれば、 System::Drawingのクラスが併用されているか判るんですけどね。 本日からDirect2Dもテスト的に組んでみますので、 g->GetHdc() を試してみます。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.4

> 1. 標準の機能 > (画像データを変形毎に計算して求めるのは非現実的なので適用していません・・変形後も移動が有る為) 既に指摘がありますし、私も既に回答しましたが、その処理は必ずしなければなりません。なので不可能な理由にはなりません。 パフォーマンス的な問題で質問者さんの目的が達せられない事があるかもしれませんが、それはこの検討段階で言えることではありません。 > 2. OpenCV > ・透過処理がアルファブレンドなので、3の処理が遅い > (理想はOpenGLの様にZバッファを使用して、背景が透過するもの・・・背景を意識しない処理のみで済むもの) アルファブレンド以外にも合成方法はありますが、試しましたか? > ・透過処理がアルファブレンドなので、同サイズの画像か背景を上面と重なる部分を検出して切り出す必要がある > (上面の画像の変形を考えると、背景を上面に合わせて切り出すのは困難) なぜ困難なのでしょうか? > ・4が矩形しか対応していないので、ひし形までしか変形できない > (視点の変更で形状こそ求めているものに近くなるが、今回の用途ではユーザーに単純操作で変形させてあげる必要がある) 方法があることは既に回答した通りです。

usami33
質問者

補足

ありがとうございます > 方法があることは既に回答した通りです。 確かに、もう一つの質問の方で、方法がある事は回答いただきましたが、 肝心の方法を一つも明示していただけてないので・・・ (やればできる的精神論だと先に進まないので、お願いいたします) すみませんが、解決策となる回答が有るのでしたら、 それを教えていただけないでしょうか? もしくはCLIベースのサンプルを教えていただけないでしょうか?

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

Gdiplus::はC++のクラスですが、GraphicsクラスはSystem.Drawing名前空間の.NETのクラスですのでC++/CLIでの利用に支障はないはずです。 なにか言葉を湾曲して捉えられていませんか? 「Graphics クラス (System.Drawing)」 http://msdn.microsoft.com/ja-jp/library/system.drawing.graphics(v=vs.110).aspx

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

一番相性の良いのはGDI+だと思います。 「GDI+ によるグラフィカル イメージの作成」 http://msdn.microsoft.com/ja-jp/library/aa983623(v=vs.71).aspx Graphics オブジェクトの使い方を調べればよいだけだと思いますが。C#とかで例がないんでしょうか?

usami33
質問者

補足

回答ありがとうございます 私も、現段階でがDGI+かDirect2Dかなって考え始めたのですが 単純なC++やC#のサンプルは若干は有るのですが、 C++/CLIだとなかなか見つかりません C++やC#のサンプルからC++/CLIにするのは、結構手間なんですよね。 慣れればいいのでしょうけど・・・ それと、既存部でSystem::Drawingを使用しているのですが どのサンプルをみても System::DrawingとGdiplus::のどちらのクラスを使用しているのかが明確になっていないため、 同じ名称の物が有るたびに 一つ一つ、動作確認しながらクラスの定義をしなくてはならず、難儀しています。

すると、全ての回答が全文表示されます。

関連するQ&A