2007年12月27日木曜日

listviewのドラッグドロップ

久しぶりにはまってた。

二つのlistviewと二つのimagelistで画像サムネイル表示して、その二つ間でドラッグドロップで移動するってーのやってたんやけど、転がってたC#+treeviewのサンプルではうまくいかない。
listviewにはString^型をAddしてるんやけど、ドロップの際DragEventArgsのeからそのStringをゲットできない。サンプルならsafe_cast(e->data->GetData(System::String::typeid))とやれば出来そうだが、出来ない。typeidが違うんだろうけどわからない。
というわけで、グローバルにListViewItemを宣言して、それを受け渡すことにして、今のところできそう。汚いやり方だろうけど、わかんないからもうこれでいいや~。

2007年12月13日木曜日

脱出?

よしっ、今週止まってたとこからようやく抜け出せそうなそんな気配。

プログラミングの勉強。ここ二日で理解がちっと深まった気がする。それで思ったけど、どうしてプログラミングにおける説明はあんなにややこしいんだろう。専門家上中級者向けならわかるけど、一から説明していきますよ的なスタンスのサイトも全然わかりづれー。
ポインタにしてもアドレス住所を指します、&で指せます、*で普通の変数みたいに扱えます。とか最初はどうでも良くない?必要に迫ってない感じがする。forとかif文はどういうときいるかすぐわかるからいいけど、どうしてポインタが必要なのか説明せずに、配列と関係してるから配列とセットで覚えましょう、じゃねーよ、っていう。怒り心頭です。

考えがまとまったら書こかな。初心者過ぎるけどいくばくかの人を救える自信はある。


で、あとこれはまあしゃあないと思うけど、配列の表し方多過ぎ。マジ。動的、静的の違いはあるやろうけど、それでも、今のVCじゃ、vectorなりlistやらCArrayとまあ。何ちゃらarrayは何種類あんねんっちゅうくらいあるし。まあ色んな人がこうした方が使いやすいで、いやこっちの方が便利だ、と頑張った末の結果なんだろうからしょうがないとは思う。


で、今回はArrayListクラスを使って要素数のわからないクラスを格納した。配列ではなくてコレクションであるらしい。とりあえずどうでもいい。なぜ、ArrayListか。それはmsdnのサンプルがほぼそのまま使えたからである。明解。
でも多分良かったのはAddメソッドを使って新しい要素を入れるとき、その型はobject型ということで、どんな型でもOKということ! うーん、これが良かったんだろう。 ただし要素の読み出し時は入れた型にキャストしないとダメ (クラス名^)ArrayList名[i];   ということはめんどいらしいが、今の自分にとっては全く気にならないので当分これでいかしてもらいます。ちなみにmsdnのサンプルで読み出し時にIEnumeratorクラスを使ったので使わせてもらったけど、全くイミフのままの利用です。

もちろんこの入れる型はポインタだろうことなので、読み出したときに思うように値が入ってなかったり、が起きているのも事実で、そこはまたどのarrayを使っても出てくるだろうプロミングにおける勉強ということなので続けます。  以上。

2007年12月12日水曜日

12/12

とりあえずメモ。
オブジェクト指向は大阪電気通信大学登尾研のページが分かりやすい。

オーバーロードされた関数がありません。はヘッダとソースで関数の定義が変わってることが多い。

まったく謎のエラーは改行しまくって調べる。

SQLではorder by句でソート出来る!


あーびびるぐらいレベル低い。
とりあえず今日は配列の動的確保という初歩を学びました。あと、人のサンプルをぱくってばかりじゃなく、自分の目的に合う手法を調べて、しっかり身に付けることが大事だということも。もひとつ、おまけにwebでもよく説明されてて、けど関係ないやろう、と思っていることも後から見れば関係ありまくりという。みんながパソコン使ってやろうとしていることは似たり寄ったりで、そこで重要視されるプログラミング技術もまた、似たり寄ったりだということ。

CLRのvectorとMFCのarray、を学んで、malloc,newがああそういうことか、とちょっと納得。時間があればわかったことを書きたかったけど今日は遅すぎる、もう帰る。結局出来なかったし。ずーん。

これからは

もっかいここに学んだことを書いていこう。

ノートはメモや日記的要素が強くて可読性が低い。まあ研究日記としてつけてきますが。

一日の終わりにここに書いてこ。

2007年12月9日日曜日

途方もなく

時間をかけて、撮影時間(こういうのをexif情報というらしい)をDateTimeにすることに成功。

String^ format= "yyyy:MM:dd HH:mm:ss";

date = DateTime::ParseExact(date_str,format,System::Globalization::DateTimeFormatInfo::InvariantInfo,System::Globalization::DateTimeStyles::None);
だ。

date = DateTime::ParseExact(date_str,format,NULL);
じゃだめ。C#じゃいいらしいが。
結局サンプルのってるとこにたどり着いて出来たけど、そこにたどり着くまでが...。
C++はほんとに厄介なようだ。同志よ、気をつけて。

2007年11月28日水曜日

VC色々

OpenCVのIplImageをVCのMFCで表示

Bitmap ^bmp = gcnew Bitmap( img->width, img->height, PixelFormat::Format24bppRgb );
BitmapData^ data ;
data = bmp->LockBits(System::Drawing::Rectangle(0, 0, bmp->Width, bmp->Height), ImageLockMode::ReadWrite, bmp->PixelFormat );
memcpy( data->Scan0.ToPointer(), img->imageData, img->imageSize );
bmp->UnlockBits( data );
this->pictureBox1->Image = bmp;



画像の撮影日時を表示、情報がなければdateTimePickerを表示
Bitmap ^bmap=gcnew Bitmap(fileName);
array^ pils = bmap->PropertyIdList;
int index = Array::IndexOf(pils, 0x9003);
if(index==-1){
this->dateTimePicker2->Visible = true;
this->dateTimePicker3->Visible = true;
}
else{
PropertyItem^ pi = bmap->PropertyItems[index];
String^ date = System::Text::Encoding::ASCII->GetString(pi->Value, 0, 19);
date = date->Replace(':', '-')->Replace(' ', '_');
this->textBox1->Text = date;
this->textBox1->Visible = true;
}


dateTimePickerに撮影日時を入れれなかった...。StringからDatetimeに変換がうまくできなくてー。

2007年10月23日火曜日

物体検出その1

そのなんぼまでいくんやろう.
お久しぶり過ぎますが、何事もなかったかのように.

今日は1日かけて、facedetectの動作やら大まかな原理を見て、そっから自分で物体検出をやろうと決めたのでした. しかし、ここで使われるHaar-like特徴を用いた分類も大局的な特徴を利用するようで個体差の大きいものを検出するのは困難らしい.いきなりこう言われて萎え気味.
しかーし、ひとまずやるしかないのであーる!自分で一から作るんはやっぱ大変やろうから.つーかアルゴリズムの理解が大変でしょ.とは言え、openCVもそんなに優しくね~.むずいよー、ようわからん.
完全にhttp://ugd555.blog1.fc2.com/category30-0.htmlを参考にいかしてもらいます.


今日はディレクトリだけ作って帰ります.しかし、必要なhaarconv.exeが見つからないまま終了.明日はまた九時までに来るべし.sampleimage選びから.

2007年7月11日水曜日

今日は授業の課題に時間くったー。でははじめます。



すんなりと記録に意向。いやしかしめんどい。gray,r,g,b,h,s,vの平均分散の14パラメータやからなあ。しかも成果が上がる見込み薄。



そーや、この前教えてもらったvisual C++簡単デバッッグ。

行の横クリックして赤丸をつけて、デバッグ開始。んで赤丸んとこまで実行してくれて、そっからF10で1行ずつ進んでくれる。っで、どこでミスってるから一目瞭然!!



で、今Exelに大まかにまとめ終わったけど、流して見た感じ、やはりそんないい特徴量はない。ガックシ。やっぱ人間が見る画像と数値って簡単に対応とれんなあ、っと超根本的なところに行き着く。googleのCEOがコンピュータは大量の情報、データを扱って色々なことができますが、微妙な違いを見つけたり、愛や情熱といったものを表現するのは得意ではありません、ってなこと言ってたけど、まさにそう、痛感。方向性間違ってるかなあ。

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!

2007年7月6日金曜日

あ、次回に向け

次は66行のcvCalcHistあたりから始めて、ゴールはRGB/HSVの各要素の特徴を数字で出すこと、ね。
そんで、英語始めるべし。ググッて出てきた英語サイトノースルーで行きましょう。リスニングもぼちぼちやろう。
大学院の願書提出などもあり、なかなか進まず。
ヒストグラムを作るのOPENCVむずい、めんどい。
とりあえず今日は腰据えて、サンプルhist.cを1行1行理解に努める。

uchar とはunsigned char 0~255のことらしい。たぶん死ぬほど初歩でしょう。
int. でdouble型になるらしい。サンプルでそうしてんだからきっと必要なんでしょう。


cvRound 浮動小数を整数にすんだって!!
cvLUTで配列をルックアップテーブルで変換すんだって!!
ルックアップテーブルって  デジタル化された輝度階調のデータを任意の階調に補正するために使用される、入力と出力の対照表のこと  だって!!
cvMATは多重行列の型だって!!サンプルじゃあcvCreateMatHeaderで1行256列のCV_8UC1 (符号無し 8 ビット 1 チャンネル)行列のヘッダが作られてた。ヘッダはおいおい理解していこう。
多重行列も配列も画像データのことだろ。勝手に判断。
んで cvSetData で、データをそのヘッダに割り当てる。上のほうで作られた配列をその行列にぶちこんだという感じ。
結局cvLUTで画像を具合良いように調節してるだけで、ヒストグラム云々は関係なしとケテーイ。


お腹が減ってきたのでこの辺で終了。
ここを乗り切れば特徴量はバンバン出せるな。

あと、院試の専門は、殊更弱いネットワークとアーキテクチャをあえて選択することにした。弱いがために勉強意欲はある。数学英語はやばい。特に英語。英文読まねば。

2007年6月27日水曜日

初日

OPENCVとvisualC++のお勉強~。ノート代わり。

 今日はcvTheresholdで2値化してー、それにcvFindContoursとcvDrawContoursを使って輪郭抽出。そっからcvContourAreaとcvStartFindContoursで領域一個一個の面積を出して、一定値以上のものだけ、輪郭抽出。使い方はほぼコピペ。
 やるにはやれたけど、2値化の輪郭抽出じゃあやっぱり精度はすげえ低い。円形度を調べて認識というここ最近の目標は結局意味ないっぽいなー。ラベリング、領域分割あたりが次のお勉強範囲でしょうか。っつーかやっぱ厳しい、画像認識は。


今日学んだ超初歩。
・新規プロジェクトを作るたびにcv.lib cxcore.lib cvaux.lib highgui.libをリンか入力にインクルード。そんとき改行するとおかしなことになります、1行で。
・画像データはプロジェクトのディレクトリに入れる。
・OPENCVの関数で入力画像と出力画像のフォーマット(言い方あってるかな)は揃える。
・ポインタ少し  まだわかってない ... swap(a ,b) → swap(&a, &b)