スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

動画は置いといてラベリングの続きです

この前のは表示ができなかったんですが表示をできるようにしました。
とりあえず、赤色と青色の円が二つあって一番大きい円と二番目に大きい円を抽出するプログラムです。
実行結果はこんな感じです。

ラベリング結果1


ラベリング結果2

赤色と青色の円をそれぞれの大きさに分けてラベリングできてることが分かると思います。

プログラムはこちらから。



私の環境はVC++2008、OpenCv2.0ですので、違うところは変えてくださいね。
スポンサーサイト

ラベリングをやってみたから書いてみる

画像処理のラベリングをやってみましたー。
といっても、

大阪大学大学院基礎工学研究科の 井村誠孝 准教授が公開しているクラス

を使っただけですが…。

OpenCvに組み込む際に新しく入れたプログラムは
LabelingBS labeling; //クラス定義
short int labeling_tmp[CAPTURE_WIDTH*CAPTURE_HEIGHT]; // ラベリング用
の2行とメインのループの中に以下のプログラムを増やしたら動きましたー(確実に動いているかは表示できるようにしないといけないので確実とは言えませんけど…)


//ラベリングを行う
if(labeling.Exec( (unsigned char*)binary[i]->imageData, labeling_tmp, CAPTURE_WIDTH, CAPTURE_HEIGHT, true, Mark_Size)==0) {

if(labeling.GetNumOfResultRegions() > 0) {
RegionInfoBS *ri = labeling.GetResultRegionInfo( 0 ); //一番大きいラベルの情報を習得する

//重心位置 answer_x,anwer_yとピクセルの情報習得
ri->GetCenterOfGravity(answer_x[i] ,answer_y[i]);
answer_pix[i] = ri->GetNumOfPixels();
}else {
//初期化
answer_x[i] = 0.f;
answer_y[i] = 0.f;
answer_pix[i] = 0.f;
}
//表示用
// for(int j=0;j<=CAPTURE_WIDTH*CAPTURE_HEIGHT;j++) {

// }

}else {

cout << "error error error error error error error error error" << endl;
}

ぐらいですね。

カメラからマウスを制御するプログラム

とりあえず、カメラからマウスを制御するプログラムが形になったんでプログラムをアップです。
本当はプログラムだけじゃなくて動く形でアップしたかったんですが、どうもエラーで実行できず…
プログラムだけにしました。

コンパイルできたら、動作方法としては、色1(黄色)に対応してマウスが移動します。
クリックは色1(黄色)と色2(赤色)をある一定値以上離せばクリックになります。
ダブルクリックはある一定値以上離した後、戻してから離すことが必要になります。

右クリックは色1(黄色)と色3(青色)をある一定値以上離せば右クリックになります。
なお、クリック時にマウスカーソルが移動してしまうことを防止することや、色1(黄色)がカメラの隅に来てしまって移動できない場合などに色4(緑色)を表示するとマウスの移動を禁止することができます。

もっと良いコントロール方法はないのかなぁ…。動かしずらくてずらくて改善しないと使えないですけどね。
改善方法があればコメントでもくださいな。

カメラからのマウス制御プログラムのソースコード

画像によってマウスを制御するプログラム

とりあえず、マウスをカメラから制御しようという企みの途中報告です。


手袋なりなんなりで指先に色を付けるプランは変わってませんが(色使った方がだいぶ簡単になるからですね)
親指に付けた色をベースカラーとし、マウスの移動やクリック判断の始点とすることにしました。

クリック判断の始点というのは、親指から他の指に付いているカラーポインタがある一定距離以上離れたらクリックもしくは右クリックとしているため始点と言ってます。

うん、非常にシンプルな内容ですね。

マウスをコントロールするためのAPIの使い方を以下にメモしておきます。
SendInput関係はあんまり情報が無いから探すの大変でしたし…。
 参考文献はこちらこちらです。

簡単に使おうと思えば以下の2行で使用できます

INPUT mouse_input[] = {{INPUT_MOUSE,1,2,0,MOUSEEVENTF_MOVE,0,0}};
::SendInput(1, mouse_input, sizeof(INPUT));


説明はまず、mouse_inputに与える引数ですが、

INPUT_MOUSEはマウスをコントロールしたい場合に選択します
キーボードのときはINPUT_KEYBOARDを選択します。

次の 1 はxの移動量(dwFlagsにより絶対座標か相対座標かを決定)
次の 2 はyの移動量(dwFlagsにより絶対座標か相対座標かを決定)
次の 3 はマウスホイールの移動量(dwFlags = MOUSEEVENTF_WHEEL の時のみ有効)
MOUSEEVENTF_MOVEはマウスの動作を選択します。他には以下の動作があります。
  const int MOUSEEVENTF_MOVED = 0x0001 ; // 移動
  const int MOUSEEVENTF_LEFTDOWN = 0x0002 ; // 左ボタン Down
  const int MOUSEEVENTF_LEFTUP = 0x0004 ; // 左ボタン Up
  const int MOUSEEVENTF_RIGHTDOWN = 0x0008 ; // 右ボタン Down
  const int MOUSEEVENTF_RIGHTUP = 0x0010 ; // 右ボタン Up
  const int MOUSEEVENTF_MIDDLEDOWN = 0x0020 ; // 中ボタン Down
  const int MOUSEEVENTF_MIDDLEUP = 0x0040 ; // 中ボタン Up
  const int MOUSEEVENTF_WHEEL = 0x0080 ; // ホイール動作
  const int MOUSEEVENTF_XDOWN = 0x0100 ;
  const int MOUSEEVENTF_XUP = 0x0200 ;
  const int MOUSEEVENTF_ABSOLUTE = 0x8000 ; // 絶対座標

最後二つはタイムスタンプと32ビットの追加情報らしいのですがよくわかりません。
以下にMOUSEINPUTの中の構造体の構造を書いておきます。

typedef struct tagMOUSEINPUT {
LONG dx; // マウスの絶対/相対座標(dwFlags で変化)
LONG dy;
DWORD mouseData; // ホイールの移動(dwFlags = MOUSEEVENTF_WHEEL の時)
DWORD dwFlags; // マウスの動作を指定するフラグ
DWORD time; // タイムスタンプ。単位は ms (詳細不明)
ULONG_PTR dwExtraInfo; // 32 ビットの追加情報
} MOUSEINPUT, *PMOUSEINPUT;

ういんどうずふぉーむあぷりをがくしゅうしたぞ。

今日は図書館に画像処理関係の本(拡張実現の本)を探しに行ったら分かりやすそうなクラスについて書いてある本があったんで読んでました。

そのついでに、前からやろうと思っていたウインドウズフォームアプリケーションをやってみたわけですが

これが、この前まで意味が分からなかったのに(分かろうとしてなかったかも?)今日は大体分かって色々と画像処理関係のものを作ってみちゃいました。

これができたのも、ほとんどハッシー大先生のおかげですね!!
以前貰った色の閾値決めるプログラムを読んでイベントでプログラムを動かすっていう方法があることを勉強させていただいたからですね。

製作中のものの外見は↓見たいな感じです。右側の空いたスペースが気になるのはこれから色々と入れるかもしれないからです。
ウインドウズフォームアプリ製作中1

機能的には、まだ2値化したものを表示するぐらいしかないんですけどね…。
でもまあ、前にやったクロマキー合成を用いて2値化画像をマスクとして使ってるんで↓みたいな表示にすることができるようになりましたけどね。

ウインドウズフォームアプリ製作中2


※機能として面白かったり、使えそうな処理があったら紹介してください!!良かったら採用しますんで。
ちなみに、色の閾値を算出&設定するような処理は作る予定です。

じゃ、おやすみー
もういい時間すぎます…。

キモトレースON

前にやってた、黄色-赤色-青色-緑色 を認識してその順にラインをつなげるプログラムをさらにいじってみました。
今回は、前回のラインをつなげる代わりに別で撮った腕の写真をクロマキー合成で重ねて生の腕から写真の腕に差し替えるような感じのプログラムとしました。

実験風景と結果はこんな感じでしたよ。

実験風景
実験風景

実験結果1
結果1

実験結果2
結果2

いやー、画像がよくない影響で不気味なものとなりましたけど…。
各関節の角度も一致しているようだし、各関節間の距離も一致しているようだからいいんじゃなかろうか。

次回へ続く…?
次はなにをしようかねぇ。研究かねぇ。

ハンクラから前貰ったやつをいじってみた。

黄色-赤色-青色-緑色 を認識してその順にラインをつなげるプログラムをいじってみました。

できたのはこんな感じ。

一回目
検出結果1


二回目
検出結果2


まぁ、できてるんじゃないんじゃなかろうか。

そういえば、「cvCopy(frame,result,0);」でコピーをしているんだけどなぜかデータが上下反転してしまう…。

原点設定はしてるつもりなんだけどねぇ…。
frame->origin = 1;
result->origin = 1;

ちょっとはOpenCv2.0を理解しました。

ほんのちょっとだけですけどね。
OpenCv1.0系の表記と同じような形でwebカメラの画像が読み込み可能になったおかげで
もらったサンプルが動くようになっただけです。

ちなみに、OpenCv2.0だとこんな書き方です。(私の環境では動作確認をしましたが、動作を保障するものではございません)

続きを読む

OpenCv2.0のインストール方法

とりあえず、明日と明後日あたりにでもOpenCv2.0にでも取り組んでみます。

今日のところはOpenCv2.0をインストールするときに参考にしたサイトでも書いておきます。


こちらこちらですね。

他にも使ってたサイトがあるかもしれないけれど、恐らくその二つだけでできるかと。
なかのひと        
amazon        
アニソンYoutubeメドレー


presented by アニソン名曲.com

検索フォーム
カウンター
プロフィール

風草

Author:風草
なんだかんだで大学院に進学した人でございます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。