2007年7月9日月曜日

三回目

さあ、いきますか。


ただの関数リファレンスのコピペの連続やなあ。





cvCalcHist は、一つ以上のシングルチャンネル画像からヒストグラムを計算する。 これだけでやってくれたらいいのに…。

cvGetMinMaxHistValueはヒストグラムのビンの最小値/最大値とそれらの場所を求める。 今回は最大値を入れてるね。

cvScaleは任意の線形変換によって配列の値を変換するようですね、ヒストグラム表示画像の高さを最大値に合わせてる。

 そして、再び基本に返って、IPlimage構造体のメンバーについて。

  nChannels   画像のチャンネル数。1だとグレイスケール、3だとカラー画像。
  depth      画素のビットの深さ。IPL_DEPTH_8Uとか。
  origin      画像の座標の始点。0が左上、1だと左下。Windowsでは1。cvCreateImageなどで作成した画像はデフォルトで0が入っているのでちゃんと指定する必要がある。
  width      画像の幅(ピクセル)
  height     画像の高さ(ピクセル)
  imageData   画像データ配列の先頭ポインタ。
  widthStep   画像の幅の大きさ。ピクセルではなくbytesなので、width*nChannelsになる。



cvSetは配列の各要素に与えられた値をセットする。第二引数valueが若干厄介、↓。

cvScalarは4個までの数を納めるコンテナ。cvScalarAllで引数の値を納める。

GetReal*Dはシングルチャンネルの配列の特定の要素を返す。

で、描画の座標指定は左上からはじめるから、一番下はhist_image->heightで、そっから値を引いて高さ。今回は cvRound(cvGetReal1D(hist->bins,i))。

横軸はi*bin_w。  bin_wはint型のイメージの幅をhist_size(今回は64に設定)で割ったもの。



という訳で、改造に着手。

まあこっからはプログラム自体は簡単。アルゴリズムに問題ありだった。平均の求め方がめちゃくちゃ。算数やな。こういうとこ学力が出る。

んで、各要素に分解するのにちょっと苦労。cvCvtPixToPlaneかcvsplitを使う。前やったな~、忘れてた。
そしてー、cvCvtColorで再び怒られ、自己解決できず結局隣の席先輩に助けを求める。
ヒストグラムは1チャネル画像からしか作れない。←至極当然。 だから、グレー画像やシングルチャネル画像でcalchistしないとだめ。でも、サンプルはいきなり読み込みでグレースケールに変えてたから、カラーからRGBとかを抜き出そうとした俺が躓くのも至極当然。不親切だ!いやまあ楽やからそうするやろうけどさ。
あとcreatehistの引数は超厄介だ。ポインタの理解が必須だ。いいサンプルあったから良かったけど、これも自己解決は到底無理だった。ちょっとずつ進んでいこう。とりあえず、やっと色々特徴量を調べる段階。明日は調査やね。

それではウェイトにGO!

0 件のコメント: