OpenCV関連メモ

・OpenCVのver2以降で、cvSnakeImage関数を利用する


以下のヘッダーをインクルードする。
#include < opencv2/legacy/legacy.hpp >

※ブログの仕様で、"<"の後にスペースを入れています。



・画素値を扱う際の注意点


記事:OpenCVで画素を直接扱う際に気をつけること参照

Eclipse for C/C++ でインデクサが更新されなくなった時の対処

Eclipse for C/C++を使用する上で、非常に便利なインデクサですが、ヘッダーの更新や追加をした際に、それらの内容が自動補完に反映されていない、ということが偶にあります。

そういった場合には、ProjectExplorerで、今編集しているプロジェクトを右クリック->Index->Rebuild、を実行すれば、インデクサが更新され、自動補完にも追加した内容が反映されるはずです。
外部プロジェクトのヘッダーを読み込んでいる際も、この操作だけで更新してくれる様です。

それでも上手く行かない場合は、Eclipseのインデクサー設定のページを参照して下さい。

Eclipse for C/C++ でインクルードファイルに警告が出る時の対処

Eclipse for C/C++ Development で開発をしているのですが、時折「コンパイルは通るけど、インクルードファイルに警告線が出ており、そのインクルードファイルに記述されている内容のコンテンツアシスタンスが効かない」ことがありました。

もちろん、自分で用意したヘッダーファイル等でしたら、project->C/C++ Build->Settings->Directoriesにパスを通していないだけのことが多いのですが、ここでは、OpenCVのインクルードファイルの様に、環境パスが通っていてコンパイルが出来るのに警告が出る様な場合を取り上げています。

<確認事項>
プロジェクトウィンドウ上(GUI)で、プロジェクト -> Includes を開いた際にパスが記述してあるか確認する。
例)/user/include

これは、デフォルトで設定されるもので、GCCでコンパイルするときにオプションを付けなくても読みに行くディレクトリが設定されているはずです。

動作がおかしい時はここに何も記述がありませんでした。
(プロジェクトをコピーしたときに消えた? 勝手に消えた?)


<修正方法>
パスの設定が消えてしまっているだけなので、パスを記述してやれば良いだけです。
しかし、何を記述すればいいのかいちいち調べるのは面倒くさいので、以下の手順を踏むことをお勧めします。

project->C/C++ Build->Discovery Options のAutomate discovery of paths and symbols のチェックをはずして「OK」でプロパティを閉じる。
その後、もう一度チェックを入れて「OK」でプロパティを閉じる。

※追記: 左側のToolsで、CかC++を選択してから行って下さい。

これで、プロジェクトをリフレッシュすると、Includesにパスが追加されるはずです。

パスが追加された後、インデクサが走ると警告が消え、コンテンツアシストも正常に動作しました。


なお、動作を確認したのは、Version: 3.5.2のEclipseです。

theme : プログラミング
genre : コンピュータ

自分用C++Tips

個人的に忘れがちなC++のTipsのメモ書きです。 気がついた時に増やしていきます。



<マクロ関数によるクラスのメンバ、構造体の要素の展開>

#define RGBColorOpen(col) col.r,col.g,col.b

class RGBColor
{
public:
double r;
double g;
double b;
};

こんな感じで、マクロ関数とクラスを定義して、やれば引数が2つ以上の関数への引数渡しが楽になる。

例えば、
 glColor3d(RGBColorOpen(data.color));

とすることで、

 glColor3d(RGBColorOpen(data.color.r, data.color.g, data.color.b));

と書いたのと等価になります。
外部のライブラリで用意されている関数を使う際に便利かも。

<参考>
http://opencv.jp/sample/basic_structures.html
http://www.ne.jp/asahi/hishidama/home/tech/c/preproc.html




<enumの要素数>

enumで値を自分で指定しなければ、最後に追加した要素の値が、それを除いた要素の数として使える。

enum a
{
A_APPLE,
A_BEE,
A_CAT,
A_NUM
};

この時、A_NUMは3になるので、A_NUM以外に定義した要素(A_APPLE,A_BEE,A_CAT)の数と同じになる。
この値は配列の確保とか、bitsetを使う時に使える。

<参考>
http://www.geocities.jp/ky_webid/cpp/library/008.html




<char*型からstring型>

char*からstringへの変換は、代入と同じ記述で行えるが、その場合文字列を記憶するメモリは別の場所に生成される。

確認用ソース:

#include < iostream >
#include < string >

using namespace std;

int main()
{
string str;
char cha[80] = "HatsuneMiku";

str = cha; // 代入と同じ書き方でOK

str[2] = 'c';
str[3] = 'h';

cout << "str:" << str << endl;
cout << "cha:" << cha << endl;
}

出力結果:
str:HachuneMiku
cha:HatsuneMiku




<型変換演算子>

<参考>
http://questionbox.jp.msn.com/qa2968923.html

Eclipseのコンパイルを高速化 ~makeオプションの設定~

EclipseでC++の開発をしているんですが、大きいプログラムをコンパイルするのに掛かる時間が気になることがしばしば・・・

そんな折りに知ったのが、makeのオプション。
makeの実行時に、-jを付けると複数ジョブを使ってコンパイルしてくれるので、最近の様にコアが複数あるCPUを使っている場合、コンパイルの高速化ができる様です。
ちなみに 「make -j」のようにオプションの引数なしの場合は、可能な数のジョブ数で勝手にやってくれるらしい。
実際にコンパイルしている時のCPU使用率を見てみると、オプション無しの時は50%(2コア中1コアしか使っていない)だったのですが、-jを加えると100%近くまで使っていることが確認でき、体感でも早くなったように感じました。

という訳で、Eclipseでのコンパイルも「make」から、「make -j」で実行させて、コンパイルに掛かる時間を短縮してみました。
設定方法は、プロジェクトのプロパティー->C/C++ビルドのビルダー設定タブで、
1.ビルダーグループ内の、「デフォルト・ビルド・コマンドを使用」のチェックを外す。
2.ビルド・コマンドを「make」から「make -j」に変更する。

で「OK」で決定すれば設定完了です。

コンパイルしたところ、ちゃんと、make -j で実行されていました。

integer constant is too large for ‘long’ typeという警告

Cでプログラムをしていて、
sum /= 10000000000;
のように大きな定数を記述したところ、「integer constant is too large for ‘long’ type」という警告が出てしまいました。
正常に動いている様子でしたが、警告が残ったままでは気持ち悪いので、対処法を検索したところ、
sum /= 10000000000LL;
のように記述すれば良いことが分かりました。

行末の「LL」が、long long (int)の定数であることを示す表現です。
他にも「uL」で、unsigned long (int)の定数であることを示す表現等があるようです。

この表現を知らなかったので、少し変な表現だな、と思ったのですが、16進数の定数を表現したい時に書く「0x」と同じ様な働きをすると考えたら納得できました。


・参考サイト様
http://docs.hp.com/ja/B5462-90001/apbs01.html

theme : プログラミング
genre : コンピュータ

OpenCVで画素を直接扱う際に気をつけること

2011/12/04更新

OpenCVで画像を扱っているIplImage構造体から、各画素へアクセスするには、

/* グレースケールの場合 */
IplImage *src = cvLoadImage(fname, CV_LOAD_IMAGE_GRAYSCALE);

for(int y=0;y < src->height;y++){
for(int x=0;x < src->width;x++)
{
cout << (unsigned char)src->imageData[src->widthStep * y + x] << endl;
}
}

/* カラーの場合(汎用。 グレースケールでも使えます) */
IplImage *src = cvLoadImage(fname, CV_LOAD_IMAGE_COLOR);

for(int y=0;y < src->height;y++){
for(int x=0;x < src->width;x++){
for(int c=0;c < src->nChannels;c++)
{
cout << (unsigned char)src->imageData[src->widthStep * y + x*src->nChannels + c] << endl;
}
}
}


の様にすれば良いわけですが、この際気を付けなければならないのは、imageDataが保持している値。

各画素の値は0〜255ですが、imageData[]の戻り値はcharとなっています。
つまり、imageData[]の値をそのまま、intやdoubleにキャストすると-127〜128と扱われてしまいます。

これを防ぐには、(unsigned char)src->imageData[src->widthStep * y + x]のように、一度unsigned charでキャストしてやればいいようです。

int型にしたいときは、(int)(unsigned char)src->imageData[src->widthStep * y + x]とすれば、ちゃんと0〜255として扱われました。
少し無駄がある気もしますが、とりあえずこれで上手く動いているので、ひとまず良しとしました。
他のやり方を知っている方がいらっしゃいましたら教えてくださると助かります。

ちなみに、直接unsigned intでキャストすると値が大変な事になりますので、お気を付けください。

Eclipseの動作を高速化

EclipseでC++を開発しているのですが、Linux版のEclipseがどうにも重いorz
Windows版は結構サクサクだったんだけどなぁ。

と結構前から悩んでいたのですが、ついに動作速度を改善する方法が見つかりました。
下のようなオプションを付けて実行すればOK。

$ ~/eclipse/eclipse -vmargs -Xms196M -Xmx196M

※追記:10/01/16 コマンドの誤りを修正致しました。

オプションでEclipseが使える物理メモリを増やしています。
各オプションの意味は、下の参考サイト様で詳しく説明されているので、そちらを参照してください。

まあ、要は最後の2つのオプションでEclipseに使わせたいメモリ量を指定すればいいわけです。

私の環境(VM上のFedora、メモリ割り当て512M)では、196Mが結構いい感じの値でした。
割り当てメモリが多すぎるとOSの動作が遅くなり、逆に遅くなることもあるので、実際に動作させて確認するのがベストかと。
なお、インザクサのメモリ設定は、max30%,64M制限としています。

いやー、これで開発がスムーズに進められます(*´∇`*)

<参考サイト様>
http://www.fiberbit.net/user/mo880d4/eclipsekidouoptiondownload.html
プロフィール

シロマ=ナノ

Author:シロマ=ナノ
参加予定イベント:
 ・C91 3日目西め28a

DIVA-AC:
 LV.199 白のシンフォニア

Flashカレンダー
Twitter
カテゴリ
最新記事
PCLクレジット
当ブログは、ピアプロ・キャラクター・ライセンス(http://piapro.jp/license/pcl)に基づいて、クリプトン・フューチャー・メディア株式会社のキャラクター 「初音ミク」「鏡音リン」「鏡音レン」「巡音ルカ」「Meiko」「Kaito」及びそれらに依拠して制作されたキャラクター「亞北ネル」「弱音ハク」を描いた作品を公開しています。
アクセスカウンター
検索フォーム
主な作品
WindowHelper(フリーソフト)
WindowHelperポップ

描いた絵・イラスト
リンク
バナー
当サイトはリンクフリーです。
バナーを使用したい場合は以下の画像をお使い下さい。
(リンク先に200x40サイズを置いてあります)

・通常版
banner

・ミク版
banner
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる