前回の記事は改行とかが非常に読みづらいですね。
ライブドアブログの記事エディタはちと使いづらいです。
まぁ、前回の記事を校正する気力はないので、
これから少しずつキレイな記事が書けるように調整してきます。


さて、今回からはしばらくOpenCVを使った画像認識プログラムを
取り留めなく載せていこうかなと思います。

【将棋コマ認識プログラム】と題して、
最終的にはカメラからリアルタイムに記譜が取れるような
プログラムを完成させたいなと思っております。

その第1回として、まずはデジカメで撮った写真を、
正方形にアフィ~ン変換する簡単なプログラムを書きました。
まぁ、アフィン変換というより、この場合はただの射影変換ですね。
こんな面倒な計算が本当に簡単なプログラムでかけてしまうのが、
OpenCVの素晴らしいところですね。本当に素晴らしい。

shougi_01
 
入力画像に対して、

//入力
m_sImage.LoadImage(_T("image.jpg"));
CvMat     src_pt;
double    srcRect[] = {
821.0f, 572.0f, //左上
256.0f, 2184.0f, //左下
3145.0f, 2248.0f, //右下
2605.0f, 537.0f, //右上
};
src_pt = cvMat(4, 2, CV_64FC1, srcRect);

//出力
m_dImage.Create(512, 512, 8, 3);
CvMat    dest_pt;
double    destRect[] = {
        0.0f, 0.0f, //左上
        0.0f, 511.0f, //左下
        511.0f, 511.0f, //右下
        511.0f, 0.0f //右上
};

dest_pt = cvMat(4, 2, CV_64FC1, destRect);
CvMat *h = cvCreateMat( 3, 3, CV_64FC1);
cvFindHomography( &src_pt, &dest_pt, h);
cvWarpPerspective( m_sImage.GetImage(), m_dImage.GetImage(), h);

こんな感じで処理をしてあげると、

shougi_02
 

こういう画像が出てくるわけです。 簡単ですね。
次の目的はコマの識別なので、これでがぜん画像処理しやすくなりましたね。


ちなみに、m_sImageとm_dImageは、
自作のCOpenCVクラスのオブジェクトです。

COpenCVクラスは、これから作りこんでいきますが、
一応そのつどアップロードしておきますので、興味ある方は
中身を覗いてみてください。今のところだいぶひどいです。


というわけで、次回はパターン認識に挑戦します。
うまくいくかしらん?


あと、C++のコードをきれいに表示する方法も模索してみます・・・。


射影変換のコードは、下記URLを参考にしました。

参考というより丸写しですね。
まぁ、この辺は基本的なところなので大目に見てください…。

続く