今日の一言
2010/06/01(Tue) ゲルギム [長年日記] 編集 1:00現在曇 18℃
_ [Windows][Linux][Ubuntu][Debian][FC][gnuplot][研究関係][雑記]gnuplotでpng画像を出力する際の色の指定
デフォルトの設定では、それぞれの線の色が非常に見分けにくい。
なので、こちら(http://www6.atwiki.jp/naminami/pages/6.html#id_dfcbb724)を参考に、色の指定をする。
具体的にはこんな感じ。
set terminal png transparent medium size 640,480 \
xffffff x000000 x404040 \
xff0000 xffa500 x66cdaa xcdb5cd \
xadd8e6 x0000ff xdda0dd x9500d3
どうも自分は若干色盲ぎみっぽい。これなら何とかみわけられる。
2010/06/02(Wed) ガンゴー [長年日記] 編集 15:30現在晴 24℃
_ [Ubuntu][FC][Linux][雑記]LinuxにIntelのWirelessLAN(intel wifi link 5100)ドライバを導入する
Ubuntu9.04を入れたDELL PRECISION M4400で無線LANがブチブチ切れまくるので、「intel wifi link 5100」のドライバを入れ直してみた。
まず、ここ(http://intellinuxwireless.org/?n=Downloads)から「iwlwifi-5000-ucode-5.4.A.11.tar.gz」をDL。
それを解凍し、「iwlwifi-5000-1.ucode」を「/lib/firmware」にコピーする。
これで再起動すれば無線LANが動くようになるはず!
*他のIntelの無線LANドライバも同様と思われ。
*結局、無線がブツブツ切れるのは直らなかった・・・
DELLかっ?DELLが悪いのかっ!?
2010/06/03(Thu) グフォ [長年日記] 編集 0:00現在曇 20℃
_ [Linux][C++]DF-Designを活用したローパスフィルタプログラム
DF-Designは、こちら(http://momiji.i.ishikawa-nct.ac.jp/dfdesign/)で公開されているFIRおよびIIRディジタルフィルタの設計/解析プログラム集。
以前に作ったプログラムが出てきたので、上げておく。
/*****************************************
実行: ./a.out data.csv filter_coefficient.csv
(引数: データファイル フィルタ係数ファイル)
******************************************/
#include <iostream>
#include <fstream> // ファイルストリームのヘッダ
#include <vector>
#include <stdlib.h>
#include <cmath>
using namespace std;
/* 引数が足りているかを確認 */
bool operand_check(int argc)
{
if(argc != 3)
{
printf("missing file operand\n operand = data,filter\n");
return false;
}
return true;
}
/* データファイルの読み込み */
bool load_signal_data(const string &filename, vector<double> &org_data)
{
string tmp_c;
ifstream fs (filename.c_str());
if (!fs)
{
cerr << "file not found: " << filename << endl;
return false;
}
while(!fs.eof())
{
getline(fs, tmp_c, '\n');
if(tmp_c[0]!='#' && tmp_c.size()!=0)
{
org_data.push_back(atof(tmp_c.c_str()));;
}
}
fs.close();
return true;
}
/* フィルタ係数ファイルの読み込み */
bool load_filter_data(const string &filename, vector< double > &fk, vector< vector<double> > &fa, vector< vector<double> > &fb, vector<int> &anum, vector<int> &bnum)
{
string tmp_c;
vector<double> a_tmp; //フィルタの各階ごとの係数aを一次配列に保存
vector<double> b_tmp; //フィルタの各階ごとの係数bを一次配列に保存
int index;
int amax(0),bmax(0); //フィルタの各階ごとのΣの回数Nを保存
ifstream fs (filename.c_str());
if(!fs)
{
cerr << "file not found: " << filename << endl;
return false;
}
getline(fs, tmp_c, '=');
index=tmp_c.find_first_of('\n');
if(index!=-1)
{
tmp_c.erase(0,index+1); //改行を詰める
}
while(!fs.eof())
{
if(tmp_c[0]=='S')
{
getline(fs, tmp_c, '\n');
while(!fs.eof())
{
getline(fs, tmp_c, '=');
index=tmp_c.find_first_of('\n');
if(index!=-1)
{
tmp_c.erase(0,index+1); //改行を詰める
}
if(tmp_c[0]=='S'){
break;
}else if(tmp_c[0]=='k')
{
getline(fs, tmp_c, '\n');
fk.push_back( atof(tmp_c.c_str()) );
}else if(tmp_c[0]=='a')
{
getline(fs, tmp_c, '\n');
a_tmp.push_back( atof(tmp_c.c_str()) );
amax++;
}else if(tmp_c[0]=='b')
{
getline(fs, tmp_c, '\n');
b_tmp.push_back( atof(tmp_c.c_str()) );
bmax++;
}
else
{
getline(fs, tmp_c, '\n'); //先頭文字がどれでもない場合、何もせず次の行へ
}
}
}
fa.push_back(a_tmp);
fb.push_back(b_tmp);
anum.push_back(amax);
bnum.push_back(bmax);
a_tmp.clear();
b_tmp.clear();
amax=0;
bmax=0;
}
fs.close();
return true;
}
/* フィルタの適用 */
bool to_filter( const vector<double> &org_data, vector<double> &fix_data, const vector< double > &fk, const vector< vector<double> > &fa, const vector< vector<double> > &fb, const vector<int> &anum,const vector<int> &bnum)
{
double a_sigma(0.0); //aにかかる部分の和
double b_sigma(0.0); //bにかかる部分の和
int num(0); //データ番号
int aloop(0); //aにかかるΣのループのカウント
int bloop(0); //aにかかるΣのループのカウント
int sec(0); //フィルタの階数のカウント
vector< double > mid; //中間値
for(num=0;num<org_data.size();num++)
{
fix_data.push_back(org_data[num]);
mid.push_back(0.0);
if(num >= anum[0])
{
for(sec=0; sec<fa.size(); sec++)
{
for(bloop=1;bloop<bnum[sec];bloop++)
{
b_sigma = b_sigma+ fb[sec][bloop] * mid[num-bloop];
}
mid[num] = fk[sec]*fix_data[num]-b_sigma;
for(aloop=0;aloop<anum[sec];aloop++)
{
a_sigma = a_sigma + fa[sec][aloop] * mid[num-aloop];
}
fix_data[num] = a_sigma;
a_sigma=0.0;
b_sigma=0.0;
}
}
}
return true;
}
/* メイン関数 */
int main(int argc, char**argv)
{
if( operand_check(argc) == false )return 0; //引数があっていなければ終了
vector< double > org_data; //フィルタ適用前のデータ
vector<int> anum; //aに対するΣの数
vector<int> bnum; //bに対するΣの数
vector< double > fk; //フィルタ係数k
vector< vector<double> > fa; //フィルタ係数a
vector< vector<double> > fb; //フィルタ係数b
vector< double > fix_data; //フィルタ適用後のデータ
/* データの読み込み */
if( load_signal_data(argv[1], org_data) == false )return 0; //ファイルが読めなかったら終了
/* フィルタの読み込み */
if( load_filter_data(argv[2], fk, fa, fb, anum, bnum) == false )return 0; //ファイルが読めなかったら終了
/* フィルタの適用 */
to_filter( org_data, fix_data, fk, fa, fb, anum, bnum);
/* データの書き出し */
ofstream fsw ("akihiro-i_signal.csv"); //決め打ち
for(int datanum=0; datanum<org_data.size();datanum++)
{
fsw << fix_data[datanum] << endl;
}
fsw.close();
return 0;
}
読み込むデータファイル(data.csv)はこんな感じ。
0 0.1 0.5 0.1 -0.4 -0.1 ・・・
フィルタの設定ファイル(filter_coefficient.csv)はこんな感じ。
Sec =1 k =5.35179369357953406e-06 b0 =0 b1 =-1.98687072069134119e+00 b2 =9.86956349390438525e-01 a0 =1.85630617396982241e+05 a1 =-3.71261234793964482e+05 a2 =1.85630617396982241e+05 Sec =2 ・・・
おそらく大きな間違いはないはず。
まあ、DF-Designがなくなったらどうしようもないけどな!
(コマンドライン版は一般公開されていない?)
_ [OpenCV][Linux][Ubuntu][Debian][FC][研究関係][雑記] OpenCV + IEEE1394カメラ + ffmpeg インストールまとめ( + mplayer)後日談
ここ(http://robotics.naist.jp/~akihiro-i/dialy/?date=20100520#p01)で、ffmpegは手動で入れろとか、コーデックが競合するからaptは使うなとか書いたが、一つ邪道な方法を思いついた。
1. apt-getでffmpegを入れる
→動画プレイヤーでコーデックが読み込めるようにセッティングされる。
2. OpenCVで録画する際にエラーが出るようになる
→aptでインストールされたライブラリを、ffmpegのソースからコンパイルしたものに置き換える。
うまくやれば両方動く。
ただ、前以上に危険なことをしているので、問題がないなら、前のやり方の方がおすすめ。
_ [OpenAL][Linux][Ubuntu][Debian][FC][Windows][研究関係][雑記] OpenALで録音する(途中)
このあたりをみれば分かりそう?
http://www.blitzbasic.com/Community/posts.php?topic=72909
http://ja.pastebin.ca/1646632
http://old.nabble.com/how-to-capture-data-%2B-possible-bug-in-documentation-td7931474.html
*録音まではたどり着けそうだが、録音したデータをどうやって扱えばいいかがよく分からなかったので、ここで断念。
時間が出来たらリベンジする。
_ [OpenAL][Linux][Ubuntu][Debian][FC][Windows][研究関係][雑記] テキストデータからwavファイルを作る(txt2wav.c) & wavファイルの中身をテキストデータで吐き出す(dumpwave.c)
テキストデータからwavファイルを作る
こちら(http://www.kk.iij4u.or.jp/~kondo/wave/index.html)のページでWAV ファイルのフォーマットの詳細が紹介されているので、それを参考にさせてもらって、ファイルIOを行うプログラムを作る。
また、ASCII テキストデータを WAVE 形式に変換する「txt2wav.c」というプログラムも公開されているので、それをみればより実践的な使い方が分かると思う。
特別なライブラリ等は使われてないので、そのまま
$ gcc txt2wav.c
とすればコンパイルできる。
*出来上がった実行ファイルを引数無しで実行すれば、プログラムの使い方を表示してくれる。
wavファイルの中身をテキストデータで吐き出す
こちら(http://oku.edu.mie-u.ac.jp/~okumura/wavefmt.html)の「dumpwave.c」を参考にすればいいと思われ。
2010/06/04(Fri) ウィータ! [長年日記] 編集 21:00現在曇 21℃
_ [Emacs][Debian][FC][Ubuntu][Linux][研究関係][雑記]aliasの使い方(「emacs」を「emacs -nw」に置き換える)
Emacsがウィンドウで開くのが鬱陶しくなってきたので、aliasを使って「-nw」をつけるようにした。
$ alias emacs='emacs -nw'
削除する場合は、
$ unalias emacs
とすればいい。登録されているaliasのリストを出すには、
$ alias
とする。
ただ、これだとコンソールを閉じると、登録したエイリアスはすべて消えてしまう。
そこで,毎回同じエイリアスを利用する場合には、ホームディレクトリにある「.bcshrc」という設定ファイルに aliasコマンドを書いておく必要がある。
これにより、その後に起動されるシェルすべてにそのエイリアスが適用されるようになる。
2010/06/05(Sat) ももも酒 [長年日記] 編集 3:30現在曇 19℃
_ [Emacs][Debian][FC][Ubuntu][Linux][研究関係][雑記] emacsのスクロールを1行単位にする
「~./.emacs」に次の一行を加えればいい。
(setq scroll-conservatively 1)
*デフォルトは0であり、半画面ずつスクロールされる。
_ [Emacs][Debian][FC][Ubuntu][Linux][研究関係][雑記] (CおよびC++における)emacsのインデントスタイルを変更する
「~./.emacs」に次の行を加える。
;; C style
(add-hook 'c-mode-common-hook
'(lambda ()
(c-set-style "bsd")
;; インデントを空白文字で行う
(setq indent-tabs-mode nil)
;; インデントの変更
(setq c-basic-offset 2)
))
;; C++ style
(add-hook 'c++-mode-hook
'(lambda()
(c-set-style "bsd")
;; インデントを空白文字で行う
(setq indent-tabs-mode nil)
;; インデントの変更
(setq c-basic-offset 2)
インデント数の変更や空白文字への置き換えはお好みで。(自分は2に変更した)
c-set-styleにもいろいろな種類があるので、好きなのを選べばいい。
*自分はこのへん(http://www.dd.e-mansion.com/~kumada/laboratory/column/c_indent.html)を参考にしました。
他にも、
(c-set-style "gnu") (c-set-style "k&r") (c-set-style "bsd") (c-set-style "linux") (c-set-style "cc-mode") (c-set-style "stroustrup") (c-set-style "ellemtel") (c-set-style "whitesmith") (c-set-style "python")
なんかがあるようです。(詳細は知らぬ)
_ [C++][Debian][FC][Ubuntu][Linux][研究関係][雑記] C言語(C++)でmkdirを行う
こんな感じで書く。
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main()
{
mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
if ( mkdir("./newdir", mode) != 0 )
{
printf("mkdir error!\n");
}
}
mkdirの第2引数には、パーミッションの設定を書く。
詳細をこちら(http://docs.hp.com/ja/B2355-90854/mkdir.2.html)から引用。
アクセスパーミッション ビットを定義する記号定数は <sys/stat.h> ヘッダファイルに存在し、引き数 mode を構成するのに用いられます。 引き数 mode の値は、必要なパーミッションの値のビットの包含的論理和 (OR) です。
S_IRUSR 所有者による読出し
S_IWUSR 所有者による書込み
S_IXUSR 所有者による実行 (検索)
S_IRGRP グループによる読出し
S_IWGRP グループによる書込み
S_IXGRP グループによる実行 (検索)
S_IROTH 他人 (つまり、誰でも) による読出し
S_IWOTH 他人による書込み
S_IXOTH 他人による実行 (検索)
参考:
2010/06/06(Sun) るいぱんこ [長年日記] 編集 0:00現在晴 21℃
_ [C++][Debian][FC][Ubuntu][Linux][研究関係][雑記] C言語(C++)でlsを行う
こんな感じで書く。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
int main( int argc, char **argv )
{
char *pass;
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if(argc<2)
{ pass = getenv("PWD");}
else
{ pass = argv[1];}
if(( dp = opendir(pass) ) == NULL )
{
perror("opendir_error!");
exit( EXIT_FAILURE );
}
while((entry = readdir(dp)) != NULL)
{
stat(entry->d_name, &statbuf);
if(S_ISDIR(statbuf.st_mode)) //ディレクトリの場合
{
printf("%s/\n", entry->d_name);
}
else //それ以外の場合
{
printf("%s\n", entry->d_name);
}
}
closedir(dp);
return(0);
}
基本的にはファイルストリームっぽいものと思えば良さそう。
参考:
・http://www.geocities.co.jp/SiliconValley-Cupertino/4084/Cprogram/myls.html
・http://www5a.biglobe.ne.jp/~nkgwtty/njaLinuxC_Lang01.html
*環境依存だけど、stat関数はかなり便利。もう少し試してみようとおもう。
_ [C++][Debian][FC][Ubuntu][Linux][研究関係][雑記] C言語(C++)でmkdirを行う・改
既にファイルが存在していた場合のエラーメッセージを追加。
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
int main()
{
DIR *dp;
mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
if ( mkdir("./newdir", mode) != 0 )
{
if ( (dp = opendir("./newdir")) != NULL )
printf("target dir exists!\n");
else
printf("mkdir error!\n");
}
}
もっと真面目にエラー処理したい場合は、「errno.h」をインクルードして、グローバル変数「errno」でエラー分けすればいい。(表示はstrerror()とかで)
参考: http://www5a.biglobe.ne.jp/~nkgwtty/njaLinuxC_Lang01.html
_ [C++][Debian][FC][Ubuntu][Linux][研究関係][雑記] C言語(C++)でディレクトリ内に、ある名前を持ったファイルが存在するかを確認する
こんな感じで書く。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
int main( int argc, char **argv )
{
char *pass;
char *target;
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if(argc<3)
{
printf("missing file operand!\n");
printf("ex: %s Pass Target\n", argv[0] );
return -1;
}
else
{
pass = argv[1];
target = argv[2];
}
if(( dp = opendir(pass) ) == NULL )
{
perror("opendir_error!");
exit( EXIT_FAILURE );
}
while((entry = readdir(dp)) != NULL)
{
if (strcmp(target,entry->d_name) == 0)
{
printf("\"%s\" found in \"%s\"\n",target, pass);
return 0;
}
}
printf("\"%s\" NOT found in \"%s\"\n",target, pass);
closedir(dp);
return(0);
}
ファイルの新規作成を行う際に、間違って上書きしてしまうのを防ぐのに応用できると思われ。
*処理速度とかは無視。適当に書いただけなので。
2010/06/07(Mon) ばよえーん [長年日記] 編集 4:00現在曇 21℃
2010/06/10(Thu) エンジェルウィスパー [長年日記] 編集 10:00現在 24℃
_ [C++][Debian][FC][Ubuntu][Linux][研究関係][雑記]引数の処理にgetoptを使ってみる
大体こんな感じ。
#include <stdio.h>
#include <unistd.h> /* getoptに必要 */
int main(int argc, char **argv)
{
const char *flags = "r:m:c:d:t:plgv";
int swt;
int r,m,c,d,t;
printf("command: %s",argv[0]);
while ((swt = getopt(argc, argv, flags)) != EOF) {
switch (swt) {
case 'r':
r = strtol(optarg, NULL, 0);
printf(" -%c %d",swt, r);
break;
case 'm':
m = strtol(optarg, NULL, 0);
printf(" -%c %d",swt, m);
break;
case 'c':
c = strtol(optarg, NULL, 0);
printf(" -%c %d",swt, c);
break;
case 'd':
d = strtol(optarg, NULL, 0);
printf(" -%c %d",swt, d);
break;
case 't':
t = strtol(optarg, NULL, 0);
printf(" -%c %d",swt, t);
break;
case 'p':
printf(" -%c",swt);
break;
case 'l':
printf(" -%c",swt);
break;
case 'g':
printf(" -%c",swt);
break;
case 'v':
printf(" -%c",swt);
break;
// case ':': /* 値を取る引数に値がなかった場合 */
// printf(" -%c needs value\n",swt);
// break;
// case '?': /* getoptの引数で指定されなかったオプションを受け取った場合 */
// printf("unknown option\n",swt);
// break;
}
}
printf("\n");
return 0;
}
便利・・・なのかな。
正直、自分で書くのと、そんなにコードの行数は変わらない気もする。
まあ、覚えておいて損はないだろう。
_ [C++][Debian][FC][Ubuntu][Linux][研究関係][雑記]引数の処理にgetoptを使ってみる(補足):引数で負の数を渡したい場合
例えば、
実行ファイル 引数1(int) 引数2(int)
というような関数を作った場合、
./a.out -1 2
のように書くと、「-1」が、1というオプションと判断されてしまう。
そのため、こちら(http://www.am.sanken.osaka-u.ac.jp/~mukaigaw/misc/getopt.html)で紹介されているように、オプションの最後を表す「--」をつけて、 "--"以降はオプションでないと宣言する必要がある。
./a.out -- -1 2
うむ、面倒!
2010/06/15(Tue) ブラス・ナックル [長年日記] 編集 12:30現在弱いにわか雨 23℃
_ [Debian][FC][Ubuntu][Linux][雑記]LinuxでDVコンバータを動かす(メモ)
HardOffでコレ(http://www.amazon.com/Dazzle-Multimedia-DM-2200-Hollywood-Bridge/dp/B000063WPO)っぽいもの(形状が微妙に違う)のジャンク品を500円で買ったので、Linux上でなんとか動かないかを調べてみた。
まだ全然動く気配無し・・・。
とりあえず、「kino」か「dvgrab」を使えばいいっぽい?
_ [Debian][FC][Ubuntu][Linux][雑記]Linuxでデジタルビデオ編集(メモ)
こことかを見れば何とかなるかも。
(http://sourceforge.jp/magazine/06/11/22/0057200)
Cinelerra - ノンリニアビデオ編集 Kino - Firewire DVビデオキャプチャ Xawdecode - アナログビデオキャプチャ MEncoder - ビデオエンコーダー DeVeDe - MEncoderのGUIフロントエンド MPlayer - 動作再生ソフトウェア dvd::rip - DVDリッピング Firefox + Flash 9 プラグイン + VideoDownloader アドオン - 動画共有サイトの動画ダウンローダー K3b - DVD/CD-R作成
まあ、かなり古い記事なんで、使えるかどうかは微妙。
2010/06/18(Fri) [長年日記] 編集 17:00現在にわか雨 24℃
2010/06/26(Sat) [長年日記] 編集
_ 【雑記】 OSが起動しない時の修復方法(書きなぐり)
(Linux)パーティションの修復: testdisk , gparted
いろいろまとめられたもの: ULTIMATE BOOT CD(起動時にブートする)
2010/06/27(Sun) [長年日記] 編集 12:30現在曇 28℃
2010/06/28(Mon) OSを再インストールする羽目に・・・ [長年日記] 編集 15:00現在曇 29℃
_ [Windows][雑記] Office2010評価版を使ってみる&試用期間が延長可能?
ここ(http://www.microsoft.com/japan/office/2010/trial/default.mspx)からDLしてインストール。(IDが必要)
(試用期間は60日っぽい)
でググっていると、試用期間を最大5回延長するツールが見つかった。
(http://www.wecode.biz/2010/05/office-2010-trial-extender.html)
・・・これは使っていいものなんだろうか?
「Although the rearm feature was made for corporate users, it cannot be illegal to use it since it's an official feature」
って書いているので、違法ではないっぽい。
まあ、完全に自己責任やね。
2010/06/30(Wed) 急がば急げ! [長年日記] 編集
_ [Linux][Ubuntu][FC][雑記] Thinkpadの加速度センサで遊ぶ(準備)
自分が持っているのはT43なので、それでやってみる。
Linux の場合には hdaps というのを入れるのが手っ取り早い。
まず、ここ(http://sourceforge.net/projects/tpctl/files/tp_smapi/)からソースをDL(おそらく最新は0.40)
解凍して
$ sudo make install HDAPS=1
追記:一部のデスとりビューションでは、
$ sudo apt-get install hdaps-utils
で入れられるっぽい。(hdaps-とかも入るので、こちらをおすすめ)
で、それを組み込む。
$ sudo modprobe hdaps
*おそらくコンパイルにカーネルソースが必要なので、それも入れておくこと。
これで、「sys/devices/platform/hdaps/calibrate」にキャリブレーションの値が、「/sys/devices/platform/hdaps/position」に現時点の位置が取り込まれる。
*テキストデータなので、lessとかでも読める。
あとはこれを読み込んで、どうにかするプログラムを書けばいい。
以上!
*IBMのThinkPad以外の加速度センサ内蔵PCでどうすればいいかは不明。時間が出来たらやる。
_ [Matlab][C++][Linux][FC][Ubuntu][Windows][雑記] mexを使ってC(C++)のプログラムをMatlab上で走らせる
基本となるソース(hello.c)は大体こんなの。
#include <stdio.h>
#include "mex.h"
int hello_world(int nlhs, int nrhs)
{
printf("Hello World in c func nlhs = %d nrhs = %d\n",nlhs,nrhs);
return 0;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello World nlhs = %d nrhs = %d\n",nlhs,nrhs);
hello_world(nlhs,nrhs);
return;
}
で、matlab上で、
>> mex hello.c
としてコンパイルし、
>> hello
で実行。(hogehoge.cのhogehogeが関数名になる)
また、mexでのコンパイル時には、gccとほぼ同様のオプションが指定できる。
なので、こんな書き方が出来る。
>> mex CC=g++ CXX=g++ hogehoge.c -lhoge -L./
これで、.cのファイルをg++でコンパイルしてくれるようになり、libhogeをリンクするように指定できたはず。
まあ、あれだ。
プログラムは、mainの代わりにmexFunctionを使う、コンパイルはgcc(g++)の代わりにと思えば大体OK?(まったくもって厳密ではないが)
*printfによる表示が、matlabにコントロールが戻るときに一度に行われるっぽい?ので、バグ探しとかは難しそう。
- scanfのような、入力を求める関数を呼ぶと、途中で終わってしまう?
_ [OpenCV][Matlab][C++][Linux][FC][Ubuntu][Windows][雑記] mexを使ってC(C++)のOpenCVを使ったプログラムをMatlab上で走らせる
次のような感じで特に問題はないはず。(ほぼOpenCVのサンプルと同じ)
ソース名:mex_opencv.cpp
#include <cv.h>
#include <highgui.h>
#include <ctype.h>
#include "mex.h"
int capture()
{
CvCapture *capture = 0;
IplImage *frame = 0;
double w = 320, h = 240;
int c;
capture = cvCreateCameraCapture (0);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
while (1) {
frame = cvQueryFrame (capture);
cvShowImage ("Capture", frame);
c = cvWaitKey (2) & 0xff;
if (c == '\x1b')
break;
}
cvReleaseCapture (&capture);
cvDestroyWindow ("Capture");
return 0;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
capture();
return;
}
コンパイル:
>> mex -I/usr/local/include/opencv -L/usr/local/lib -lml -lcvaux -lhighgui -lcv -lcxcore mex_opencv.cpp
どうも
`pkg-config --cflags opencv`
とか
`pkg-config --libs opencv`
は使えないっぽいので、そのまま書く。
それ以外はgccとかでコンパイルする際とほぼ同じオプションでいいはず。
実行は
>> mex_opencv
でOK。
(「Esc」で終了するはずだが、Windowがきちんと消えない・・・要改善)
以上!