OpenCVは当然ながらオープンソースなので、ソースコードは公開されているのですが、ある特定の関数がOpenCV内部では、どのような処理をしているのか?を確認するのに、いきなりソースコードを眺めても、処理を追うのは、かなり困難かと思います。
そんな時には、やはりデバッグ実行しながら処理を追いかけた方が分かりやすいのですが、OpenCVの関数内へステップイン実行する方法を紹介します。
まず、確認したい処理のサンプルプログラムを作成し、ステップイン(関数の中身へ移動する)したい関数の行の右端のグレーの部分をクリックするか、ステップインする関数の行を選択してF9ボタンを押し、ブレイクポイント(処理を一時停止する場所)を指定します。
すると行の左側へ赤丸印が表示され、デバッグ実行を行うと、この赤丸印までの処理が行われ、一時停止状態となります。
次にメニューのデバッグ→ステップインと選択するか、F11ボタンを押すと、以下のように初回だけ表示されます。
これは、今回の例ではcv::imshowの中身を見ようとしているのですが、この処理に必要なファイルがどこにあるのか?を聞かれます。
今回の例ではファイルの種類の部分にmatrix.cppと表示されているので、このファイルがあるフォルダを探し、そのフォルダを指定します。
ちなみに、matrix.cppのファイルは \opencv\modules\core\src 内にあります。
すると、ブレークポイントで指定した行で使われている関数の中へ、処理が移動していきます。
引き続きステップイン(F11ボタンを押す)実行を行うと、さらに関数の内部へ、ステップオーバー(F10ボタンを押す)実行を行うと、関数の内部へは行かずに、次の行へと移動します。
そうすると、実際に行われている処理の通りに、表示される行が移動していくので、処理の流れを確認し易いかと思います。
ちなみに!
今回、確認したかったのはcv::imshowの処理。
Windowsでは画像データのメモリの幅が4の倍数バイトとなるように調整しないと正しく表示されないハズにも係わらず、C++インターフェースのcv:Matでは、メモリの幅のバイト数を示すstepの値が、必ずしも4の倍数とならないのが、とても気になっていたんです。
そこで、実際にモノクロ8ビット(CV_8UC1)のcv::Matをcv::imshowへ渡し、ステップイン実行してみたところ、モノクロ画像と同じ画素数の24bitのメモリを確保し(このメモリは、幅が4の倍数バイトに調整されている)、cvConvertImage関数が呼ばれ、その内部では、OpenCV内部だけで使われるicvCvt_Gray2BGR_8u_C1C3Rという関数が実行され、8bitグレーの輝度値がR,G,Bの値が同じ、24bitのカラーデータへと変換されて、Win32APIのBitBltで画像が表示されている事が分かりました。
つまり、cv::imshowでモノクロの画像を表示する時に関数内部では、モノクロ画像の3倍のメモリが確保され、モノクロからカラーデータへの変換が行われています。
って、なんて無駄なんだ~!
この辺はやっぱりIplImageの方が好きなんだよな~