C++/CLIで画像処理

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

C++/CLIで画像処理

お世話になります VC 2010 C++/CLIで作成されている、既存プロジェクトに以下のグラフィック機能を追加したいのですが、 色々試しては挫折してます。 実現可能なライブラリを教えていただけないでしょうか。 【補足】 ・既存プロジェクトはそれなりに大きなものなので、既存部の書き換えは考えておりません ・既存プロジェクトはPictureBoxで出来る範囲の色々な描画を行っているので、ここはそのまま残す予定 【追加機能】※ 以下は新規に子フォームを作成して、独立した機能として追加予定 1. 異なるサイズの画像(写真)を重ねて描画する(これは、単純なので標準の機能を始め全てで出来ます。) 2. 上面の画像を半透明にして、背景の写真を透過 (上面画像の背景を透過するのではなく、上面画像の全体を透過) 3. 上面の画像をマウスに追従して移動 4. 上面の画像の4点を個別にマウス指定で変形 5. 1~4で出来上がった画像の合成&出力 【試したもの】(理解ミスが有るかもしれません) ※事前検討で実現困難なライブラリも小細工できないかと、念のためそれぞれ試しております。 1. 標準の機能 ・アドバイスをいただき、透過はできたのですが、4の変形ができない (画像データを変形毎に計算して求めるのは非現実的なので適用していません・・変形後も移動が有る為) 2. OpenCV ・透過処理がアルファブレンドなので、3の処理が遅い (理想はOpenGLの様にZバッファを使用して、背景が透過するもの・・・背景を意識しない処理のみで済むもの) ・透過処理がアルファブレンドなので、同サイズの画像か背景を上面と重なる部分を検出して切り出す必要がある (上面の画像の変形を考えると、背景を上面に合わせて切り出すのは困難) ・4が矩形しか対応していないので、ひし形までしか変形できない (視点の変更で形状こそ求めているものに近くなるが、今回の用途ではユーザーに単純操作で変形させてあげる必要がある) 3.OpenGL ・画像単体での読み書きができない (テクスチャマッピング機能を用いるか他のライブラリを併用する必要がある) ・平面ポリゴンを定義して、テクスチャマッピングをした場合、4の変形時にマッピング画像が追従するようにする必要がある 4.DXLib ・追加機能に対応する機能を持ってはいるが、そもそもCLIに対応していない 5.GDI+ ・CLI対応のサンプルが見つからない? (CLI以外のサンプルは多々見かけるのですが、ウインドウのハンドルやポインタの使い方が異なり、苦戦中) ・そもそも、説明しているサイトが少ない (私のような素人がみるとどれがGDI+の記述でどれが標準の機能なのか判らないものばかり  せめてGDI+のXXXを使用すると以下のソースになるみたいな説明がされているサイトがが有れば教えてください) 6.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

  • 画像の透過処理のやり方

    windowsのペイントで画像を作ってるのですが、透過処理ができません; 画像をアップしても、画像の周りが白くなっちゃうんです。 どうすればいいですか? メニューの「変形」の「背景を不透明にする」はチェックしてないんですが。 まだ初心者なのでくわしく説明していただけるとうれしいですっ! よろしくお願いしますm(__)m

    • ベストアンサー
    • CSS
  • MFC,C++/CLI,C#の共存

    CCDカメラからの画像を画像処理ボード(MV-10というボードです)で受け取り、そのデータを使ったWindowsプログラムを開発したいと考えています。 開発はVisual C# 2005か Visual C++ 2005(C++/CLI)で行いたい(理想としては、フォームなど外観はC#、内部処理はC++)のですが、画像処理ボードのライブラリがMFCとなっていました。 色々と調べて、MFCとC++/CLIを共存させることが出来るらしく、またC#とC++/CLIを共存させることも出来るらしいと言うことが分かったのですが、具体多的な方法が分かりません。 具体的な方法が記述されている書籍や、ウェブサイトなどがありましたら、教えていただきたいです。

  • C++/CLIでの画像情報(RGB)の取得

    Visual C++ 2005のC++/CLI対応で、.NET Frameworkのクラスライブラリを使用し、画像処理のプログラムを作成しています。 pictureBox1->Image = gcnew Bitmap( ファイル名 ); で、画像を表示するところまではできたのですが、表示したBitmapデータのRGBカラー情報を取得する方法がわからず、困っています。 ご存知の方、教えてください。 また、このような情報が載っている書籍やサイトがありましたら、合わせて教えてください。 よろしくお願いします。 必要な情報が抜けていましたら、お手数ですが、ご指摘お願いします。

  • 画像の透過処理の仕方を教えて下さい。

    フォトショップでイラストを描いてるのですが、いつも出来上がりの画像の周りが四角く囲われてます。 画像だけを抜き出せたら、背景にいろんな写真を持ってきて遊べるのに・・・。 透過処理というのがあるそうですが、どうやればいいのですか? また、透過処理をしなくても、写真やその他の画像と合成する方法があったら教えて下さい。

  • 画像処理について教えてください

    画像処理をしたいのですが、例えばマネキンに服を着せた写真を、服のみカラーを残して、マネキンや背景をセピアにしたいのですが、これは何という機能でしょうか?この機能がついたソフトをご存知でしたら教えてください。できればフリーや安いものがいいです。 あと、商品画像のみで背景をなくしてしまう処理もしたいのですが、どうやってよいかわかりません。 何もわからなくて申し訳ございませんが、どなたか教えていただけませんでしょうか?よろしくお願いいたします

  • C++/CLIでfstream(.NET 3.5)

    過去の資産にアクセスするためにC#から使うクラスライブラリをC++/CLIで作成しています。 当初は.NET Framework 4.5で作成していたのですが、Windows7でFrameworkを追加するのが面倒くさいという事で、3.5でプロジェクトを起こし直してコンパイルしました。 そうしたところ、大量のリンクエラーが発生しました。 --抜粋(下記を含め、合計18行のエラー) VCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata は、COFF シンボル テーブルと整合しません: LINK : error LNK2034: metadata は、COFF シンボル テーブルと整合しません MSVCMRTD.lib(locale0_implib.obj) : error LNK2020: 未解決のトークン (0A0000A1) "extern "C" double __cdecl _hypot(double,double)" (?_hypot@@$$J0YANNN@Z) -- 調査した結果、fstream関連を定義するとこの症状が出る事がわかりました。 そこで、単純に以下のプロジェクトを作成したところ、同じ現象が発生しました。 1..NET Framework 3.5でCLRクラスライブラリのプロジェクトを作成する(ここではTESTプロジェクト) 2.作成されたテンプレートの「TEST.h」に関数を追加する -----(TEST.h) // TEST.h #pragma once #include <fstream> using namespace System; namespace TEST { public ref class Class1 { void test() { std::fstream f; } }; } ---- 3.コンパイル → リンクエラー 標準関数はいくつか使っているのですが、fstream系だけがダメなようです。 (sstreamはOKでした) これに関して、何か対策方法はないものでしょうか。 情報があればお教え下さい。 よろしくお願いいたします。 開発環境: Windows 8.1 VisualStudio 2013 Pro

  • 二枚の画像(背景と人物)を使って背景透過処理

    二枚の画像(背景と人物)を使って背景透過処理を行おうとすると 人物画像側に境界線(アンチエイリアスの部分)が残ってしまいます。 これを処理するには境界線を太く濃くするか、 地道にひとつずつ消して行くしかないんでしょうか。 使用ソフトはフォトショップ5です。

  • 透過PNG画像がおかしい

    透過PNG画像なのに、編集ソフトでは、背景が真っ黒になっていたり 使えません。 なんとかうまく透過になるようにしたいです。 ソフトが、PNG画像に対応していないためだと思われるのですが、 どうしたらいいですか?

  • VC++.netにおけるPictureBox内の画像の透過処理について。

    現在VisualC++で囲碁対局ソフトを作成しています。 盤面イメージをPictureBoxに貼り付け、さらにそのPictureBoxの上に石を貼り付けるための小さいPictureBoxを升目の数だけ配置したのですが、そうすると下の盤面画像が見えなくなってしまいました。 そこで、石画像に背景色の透過処理を施したいのですが、うまくいきません。石の画像のうちの背景色の部分を透過させ、その部分には下の盤面画像が表示されるような方法を知っている方がいましたら、是非、お教えください。

  • PowerPointに透過画像を貼り付けたい(PaintShopPro使用)

    PowerPointにイラストを貼り付けたいのですが、Gifで透過処理をしても背景が白やグレーになってしまいます。 一度は同じソースからとったイラストを透過で貼り付けることができたのですが、マスタを触ってデータの背景に手を加えた後、PaintShopProで透過処理した画像を貼り付けるとどうしても背景に色がついてしまいます。 マスタを触ったことに原因があるのでしょうか??