ページ 11

C# BitmapとIplImage->Bitmapの相違について

Posted: 2015年8月17日(月) 16:42
by kazuoni
お久しぶりです。kazuoniです。

少し気になったことがあるので質問させていただきます。
環境は以下の通りです。

開発環境 MicroSoft Visual Studio Community 2013
使用ライブラリ OpenCvSharp

C#標準で用意されているBitmapで画像を読み込んだ画像(Image A)と
OpenCvSharpで一度読み込んだのち、Bitmap変換した画像(Image B)で格納値が微妙に異なる
ことがあります。(この現象が生じる画像を添付いたしました。)

二画像の格納値を比較してみたところ、以下の点が異なっていました。
以下、相違のあったプロパティ名です。
・Flags
・HorizontalResolution (※)
・PropertyIdList
・PropertyItems
・VerticalResolution(※)

特に(※)の部分で相違があると少々困ってしまうのですが、なぜこのようなことが起きてしまうのでしょうか。
現状はImage Bの方で当方の仕様を満たしているので、問題ないのですが、
少し腑に落ちない結果となっているため質問させていただきました。

ご回答のほどよろしくお願い致します。

コード:

                Bitmap bitmap = new Bitmap(filename); // Image A
                Bitmap bitmap_ = BitmapConverter.ToBitmap(Cv.LoadImage(filename)); // Image B

Re: C# BitmapとIplImage->Bitmapの相違について

Posted: 2015年8月18日(火) 11:07
by YuO
OpenCVの方は試していませんが,BITMAPINFOHEADERにある情報と,System.Drawing.Bitmapから得られる情報は一致しています。
元々の想定自体が間違っていませんか。

ちなみに,チェックは添付のプログラムで行いました。
  • ConsoleApplication5がC++で単純にBITMAPFILEHADERとBITMAPINFOHEADERを読んでBITMAPINFOHEADERにあるResolutionを表示するものと,GDI+を使ってResolutionを表示するもの。
    Reference Sourceを元にGDI+における対応を決定しています。
  • ConsoleApplication1はC#でResolutionを読み出すもの。

Re: C# BitmapとIplImage->Bitmapの相違について

Posted: 2015年8月18日(火) 15:36
by kazuoni
Yuo様

ご回答ありがとうございました。
確認してみたところ、おっしゃる通り、前提条件が間違っておりました。

コントロール描画の際に、Graphicオブジェクトを自前で生成しており、解像度が未設定(初期値xdpi=ydpi=96)でした。
自前で描画画像に合わせて生成することで、System.Drawing.Bitmapで生成した画像でも仕様を満たすようになりました。

Yuoさんのご提示していただいたサンプルでIplImage -> Bitmapと変換してみましたが、
xdpi = ydpi = 96となるようです。(本来は72dpi)
調べてみたらOpenCVは仕様でdpi=96で吐き出すんですね。調べて初めて知りました。
Change dpi of an image in OpenCV

これにて解決とさせていただきます。
解決まで導いていただき誠にありがとうございました。