2010年06月23日

Box2Dで衝突検出のみ行う方法

Box2Dがv2.1.0になって色々変わっているようですね。
とりあえずv2.1.0で衝突判定だけを行う方法をメモしておきます。

参考
  1. TestBed/PolyCollisionデモ
  2. Using Box2d just for collision detection(no physics)
やり方
  1. v2.1.0からb2CircleShapeに名前が変わりました。
  2. b2Bodyと関連付けないので、自分で位置/姿勢情報を持つ必要があります。
  3. そのため、collsionCircleというクラスを作成し、b2Transformを持たせています。
  4. b2CollisionCirclesで衝突判定を行い、結果をb2Manifoldに格納します。
  5. ワールド座標が知りたい場合は、結果をb2WorldManifoldに格納します。
実行結果

box2d_circle_collision.PNG

接触点が赤点になっています。
全部の円で衝突検出しているので、円数が増えると計算量が増えますね。
b2Bodyと関連付ければ、BroadPhaseとか使ってうまく衝突検出してくれるので、
関連付けしつつ物理演算をしない方法があればいいのですが。
b2KinematicBodyにするとb2KinematicBody同士では衝突検出してくれなくなるようですし。

続きを読む
web拍手 by FC2
posted by シンドラー at 03:36 | Comment(0) | TrackBack(0) | Box2D | このブログの読者になる | 更新情報をチェックする

2010年06月20日

TestBedに自分のプログラムを追加する方法について

時間が経つとやり方を忘れてしまうのでメモっておきます。

1. Box2Dインストールフォルダ\Box2D\Examples\TestBed\Testsを開く
2. 適当にサンプルヘッダファイルをコピー、名前変更

ApplyForce.h -> hogehoge.h

3. Box2Dインストールフォルダ\Box2D\Build\VC8\Box2D.slnを開く
4. TestBedプロジェクトのTestsにコピーしたファイルを追加
5. 追加したhogehoge.hを開き、APPLY_FORCEをHOGE_HOGE、ApplyForceをHogeHogeなど、自分のクラス名に置換する
6. TestEntries.cppを編集し、他のサンプルを参考に以下の2行を追加

#include "hogehoge.h"

TestEntry g_testEntries[] =
{
    {"HogeHoge Test", HogeHoge::Create},
    ...
}

7. ソリューションのビルド→実行で確認
8. 後は自分のプログラムへと書き換えていく

注意点?としては、1. のファイルを置く場所と、6. で自分のクラスをTestBedに登録するところぐらいですかね。

web拍手 by FC2
posted by シンドラー at 16:54 | Comment(0) | TrackBack(0) | Box2D | このブログの読者になる | 更新情報をチェックする

2010年06月12日

ラスタベクトル変換について

前回の続きです。

とりあえず細線化と線分への分割が終わったので、基本図形かどうかの判定を行います。判定には以前の参考文献をそのまま使用しております。

その後、適当にサンプリングして点を選んで、3点でできる2本の直線の内積から適当にコーナー点を検出して、判定結果で場合分けしてラスタベクトル変換を行います。

1.BMP等のファイルを読み込む
2.カラー画像の場合は、RGBをYCrCbに変換し、Y(輝度値)を使ってグレースケール化
3.グレースケール化した画像を2値化。閾値は判別分析法で決定
4. 境界線追跡とラベリング
5.4-連結細線化を使用して細線化
6.細線化した画像からの特徴点抽出
7. 抽出した特徴点を元に線分に分割
8. ひげを削除してもう一度特徴点抽出と線分分割
9. 基本図形かどうか、直線かどうかなどを判定 ← new
10. 基本図形の場合、基本図形の情報を使ってラスタベクトル変換 ← new
11. それ以外の場合は特徴点とコーナー点を直線で結んでラスタベクトル変換 ← new

実行結果

左が原画像、右がラスタベクトル変換後の画像です。判定の精度は低いし画像によっては連結チェックなどで無限ループに陥ってしまうし前処理のためのプログラムだけでこんなに時間がかかるし困ったものですね。

IP_test_004.pngIP_test_005.png


まぁ大体感じはわかったので、今後はOpenCVを使おうと思います。
web拍手 by FC2
posted by シンドラー at 00:25 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

2010年06月05日

曲線への分割とひげの除去について

前回の続きです。

手書きの文字や太い線を細線化した場合、不必要な線(ひげ)が発生することがあります。今サンプルで使っている画像でも、三角形の上とか四角形の右下などにひげが発生してしまっています。今回はこのひげの除去を行います。

ひげは短い線と考えられるので、ラベリングした頂点データ群を曲線に分割し、ある一定以上短い線はひげであるとみなし除去することにしました。

1.BMP等のファイルを読み込む
2.カラー画像の場合は、RGBをYCrCbに変換し、Y(輝度値)を使ってグレースケール化
3.グレースケール化した画像を2値化。閾値は判別分析法で決定
4. 境界線追跡とラベリング
5.4-連結細線化を使用して細線化
6.細線化した画像からの特徴点抽出
7. 抽出した特徴点を元に線分に分割 ← new
8. ひげを削除してもう一度特徴点抽出と線分分割 ← new
9.ラスタベクトル変換

実行結果

左がひげを考慮せずに線に分割した場合、右がひげを除去した後に線に分割した場合です。

ip_test_005.JPGip_test_006.JPG

ラスタベクトル変換を行う場合、連結線のみで構成された閉じた図形は円や四角などの基本図形としてみなしますので、右図のようにひげを除去することで三角形や四角形も正しく基本図形とみなすことができるようになります。

次はサンプリングとコーナー検出ですね・・・。

web拍手 by FC2
posted by シンドラー at 23:45 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする

STLのvectorのメモ

いつもやり方忘れてグーグル先生に尋ねているのでメモしておきます。

// vectorの宣言
std::vector<int> test;

for (int i=0; i<10; i++)
{
test.push_back(i);
}

// イテレータの宣言
std::vector<int>::iterator it;

// 全ての要素の参照
for (it = test.begin(); it != test.end(); )
{
std::cout << *it << std::endl;

// データの削除(戻り値が次の要素を指している)
it = test.erase(it);
}

メモでもいいのでコマメに更新したいものです。
web拍手 by FC2
posted by シンドラー at 15:56 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2010年06月01日

境界線追跡とラベリングについて

前回の続きです。

細線化するまえに領域抽出が必要だったようなので、境界線追跡とラベリングを行い、領域抽出を行いました。この辺りも色々改善すべき点があります。

1.BMP等のファイルを読み込む
2.カラー画像の場合は、RGBをYCrCbに変換し、Y(輝度値)を使ってグレースケール化
3.グレースケール化した画像を2値化。閾値は判別分析法で決定
4. 境界線追跡とラベリング ← new
5.4-連結細線化を使用して細線化
6.細線化した画像からの特徴点抽出
7.ラスタベクトル変換

実行結果

領域抽出までです。この後、細線化と特徴点抽出を行ってラスタベクトル変換に入ります。

ip_test_002.JPGip_test_003.jpg
web拍手 by FC2
posted by シンドラー at 14:26 | Comment(0) | TrackBack(0) | Image Processing | このブログの読者になる | 更新情報をチェックする