2012年12月1日土曜日

ここのところ覚えた小技のメモ

いろいろアイデアを考えるのはいいけど、結構実装の面で詰まることも多かったので詰まったところをメモ。主にC++の基本的なところとちょっとした小技(?)、忘れると1〜数日潰す可能性あり。

参考資料 : ググって出てきた様々なページ。ヤフー知恵袋、stackoverflow

1.vectorのvectorの作り方とvectorのきほん

 vector<vector<double> > ←最後の「>」の手前に半角スペース入れないとだめ(環境に因るかも)


2.vectorの要素の追加

  (vector).push_back(入れたい値) でvectorの最後尾に新しい要素を入れる。

カラのvectorの定義だけして vector[n]=値 とかで代入しようとするとエラーになる。
まずvector.push_back=値 またはassign()とかresize()適当なサイズと初期値を設定する。
vectorのvectorならvector.push_back=2層目vector<〜〜> みたいな感じで使う 。

pythonのリストなら適当でなんとかなるのにね。不便だね。


3.opencvのROIの使い方

 Rect roirect=Rect(0,0,150,150);// まず四角を定義してROIの設定


 Mat imgroi=img;// ←ここでimg(roirect)  にすると定義した四角がROIになったimgをimgroiとして定義できる。

 
ここまではいいがROIのオフセット(ROIの四角の起点になる座標)が(0,0)じゃないときオフセットを考慮する必要がある。 やらないと例えばROIが画面中心らへんだった時検出したキーポイントが画面中心じゃなくて左上とかにずれて表示される。

↓こんな感じ




    for(int i=0;i<keypoint.size();i++){
        keypoint.pt.x += roirect.x;  ←検出したキーポイントの座標をオフセット分だけずらす
        keypoint.pt.y += roirect.y;  ←キーポイント構造体の座標取り出し方法
        (〜.pt.x, 〜.pt.y)も意外に忘れやすいので注意
    }

↑キーポイントはROIの中だけで検出されるけどキーポイント座標(pt.x pt.y)もROIのローカル座標でが決定されるのでオフセット分ずらす必要がある(オフセットが(0,0)なら別にずらさなくていい)。

 4.文字扱いの数字を数値として取り出す方法

ファイルとかから読み込んだ数値をちゃんとintなりdoubleで読み込む(変換する)コツ。stringstream を使うだけ。これもpythonなら意識する必要すらない部分。C++万歳!(皮肉)

↓以下やり方。

stringstream ss; ←stringstreamのインスタンスをつくる

string str;  ←stringと任意の形式(この例ではdouble)を定義
double dbl;

ss << str;// ←stringstreamにstringをぶち込む
ss >>dbl;  ←stringstreamからdoubleに取り出す。これで変換完了。




ss.clear(); ←ssの中身をクリア、しないとろくなことにならないよ。ループで使う時とか。

 5.opencv:任意の座標の色情報の取り出し方

意外に手こずった部分。Vec3bという型を作って以下の書式で取り出す。

 Vec3b color = img.at<Vec3b>(Y座標,X座標); ←.at<Vec3b>はおそらくY座標、X座標の順で定義されている。普通と違うので注意(環境やimgの種類によってちがうかも)。
また、取り出した色情報((B,G,R),0〜256の数字)はデフォルトだと多分charで入ってるので
intへのキャストが必要↓

 (int)ccolor[0]+100 ;   ←例えば取り出した色の青色成分に100足すとき


今日のところはとりあえず終了。

0 件のコメント:

コメントを投稿