トップ 最新 追記
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2010/05/01(Sat) 実家に帰ります [長年日記] 編集

_ [doxygen][Ubuntu][Linux][雑記]doxygenの導入

M1のプログラム課題のサンプルコードを作っていて、せっかくなので、「doxygen」で使えるコメントを習得しようと考えた。

まず、「Doxygen」等をインストール。

 $ apt-get install doxygen doxygen-gui doxygen-doc graphviz

「doxygen-gui」は、doxywizardという、doxygenのパラメータファイルdoxyfileを作成するGUIツールをインストールする。

また、「doxygen-doc」はdoxygenの英文ドキュメントとサンプルをインストールする。

で、後は、doxygenにかけたいファイルのあるディレクトリに「Doxyfile」を作り、

 $ doxygen

とするだけ。

 $ doxygen -g

で「Doxyfile」のテンプレートが出来るので、それをいじればいい。

*自分は、こちら(http://s-yanagita.hp.infoseek.co.jp/pc/linux/doxygen.html)にある、

http://s-yanagita.hp.infoseek.co.jp/pc/linux/doxygen-file/Doxyfile

をDLして使わせてもらってます。

とりあえず、「RECURSIVE」をYESにするとサブディレクトリに対しても入力ファイルの検索を行うようになることだけはメモっておく。

詳しい設定の仕方は以下のURL等を参考にした。

 http://s-yanagita.hp.infoseek.co.jp/pc/linux/doxygen.html
 http://d.hatena.ne.jp/malibu-bulldog/20070824/1187924604
 http://masaoo.blogspot.com/2009/08/doxygen.html
 http://www26.atwiki.jp/saborigineer/pages/11.html

ソースへのコメントの書き方は、この辺を参考にした。

 http://www26.atwiki.jp/saborigineer/pages/11.html
 http://www.h2.dion.ne.jp/~miyawaki/knoppix/doxygen.html
 http://www.denshin8.jp/den8dev/doxygen.html
 http://members.at.infoseek.co.jp/sakura_editor/comment-rule.html

あと、latexでpdfを作成したりも出来たと思うが、日本語pdfの作り方のメモがどっかに行ったので、とりあえず保留。

以上!

*サンプルとして、前に自分が書いた「AAテンプレートマッチング」のプログラムを置いておく。(http://robotics.naist.jp/~akihiro-i/dialy/source/sample-ascii-matching.cpp

_ [Linux][Ubuntu][FC][雑記]scpっぽくrsyncを使う

こんな感じで。

 $ rsync -auvz -e ssh Desktop/hogehoge/ hogeserver:/home/hogehoge/

ちなみに、ここ(http://rick-brain.sblo.jp/article/36501597.html)とここ(http://landisk.kororo.jp/diary/28_rsync.php)を参考にした。

解説を引用。

解説:

 「オプション」

  -a 使用用途が高いオプション群をまとめて指定するオプション

  -u 同期先のファイルがコピーファイルよりも新しい場合スキップ

  -v 進行状況の表示

  -z 転送の際ファイル圧縮

  -e sshを使用

  --exclude-from 転送する中身の指定

本日のツッコミ(全23件) [ツッコミを入れる]

Before...

_ Ultram [vyeqwbljijsp.j, http://ultram247.net/ Ultram celexa, LonDb..]

_ Xanax [yuwuybljijsp.j, http://www.axtracker.com/xanax.html Generi..]

_ Ambien zolpidem [ytzbebljijsp.j, http://www.cornwellelectric.com/ambien.htm..]


2010/05/02(Sun) 実家なうとか言ってみる [長年日記] 編集

_ [Windows][Linux][Ubuntu][FC][雑記][Zaurus]Google Mapsをローカルで使う その4:地図データをイメージ化する

gm_lite(http://tera-cc.ddo.jp/blog/)は、イメージ化したファイルにも対応しているらしい。

圧縮ソフトもついているらしく、

Windowsの場合は、

 地図のダウンロード後にgm_lite/cygenv/genromfs.batをダブルクリック

するだけでいい模様。

もちろん、Linuxでも圧縮できる。・・・はずなのだが、自分の勘違いか、どうもうまくいかない。

なので、

 $ sudo apt-get install genromfs

でromファイル生成のコマンドを入れて、直に

 $ genromfs -f gm_lite.rom -d gm_lite/

を打ち込んだ。(batファイル内のコマンドそのまま)

これで出来るはず?

*もしかしたら2ギガの壁があるかも・・

_ [Windows][Linux][Ubuntu][FC][雑記][Zaurus]Google Mapsをローカルで使う その5:イメージ化した地図データをgm_liteで使う

Zaurus側の準備として、

1. 適当な場所にgm_lite/bin/gml_mountをコピーし、

2. miscfs-modules_c***_arm.ipk をインストール

*こちら(http://tera-cc.ddo.jp/blog/category/windows/)にあります

3. gm_lite/gm_lite.htmlをブラウザで開く前に、

 $ /path/to/gml_mount /path/to/gm_lite.rom

としてイメージファイルをマウントする

後は普通に開く。

*使用後はきちんとアンマウントしておく。


2010/05/03(Mon) GW [長年日記] 編集

_ [Ubuntu][FC][Linux][雑記] KDE用のテキストエディタkwrite

geditを使っていたら、「もっといいのがある」といって「kwrite」を教えてもらった。

正直、まだ全然使えてないですが、とりあえず名前だけメモっておきます。

_ [雑記] apt-getでfirefoxが入らない

再インストールしようとして気づいた。404 errorとか吐いてる。

apt-get updateも出来なくなってるし・・・

うーむ、うちのネットワークが不調なだけか?

けどその状況でもkwtriteは入れられたという不思議。


2010/05/04(Tue) 失敗した・・・! [長年日記] 編集

_ [Zaurus][雑記]SL-C3000にOperaをインストールする

ここ(http://www.chashu.org/zaurus/)を参考にした。

 opera_7.25-lite-2_arm.ipk
 opera-chartable_7.25-2_arm.ipk
 opera7-jpn-helper_0.0.2a_qshdlg.ipk
 qshdlg_0.6.2-1_arm.ipk

の4つをDLし、上から順にインストールする。

で、なぜか新たなタブの中にインストールされるので、それを任意のところに移す。

あとは、起動時に読み込むファイルがナイトか行ってくるので、適当にでっち上げる。

以上!

_ [Zaurus][雑記]SL-C3000にZEditorをインストールする

単純に自分がviが使えないだけなんだが。

ここ(http://www.chashu.org/zaurus/)を参考にした。

公式(http://satoshi.web5.jp/f_soft/dw_zedit.htm)からDLしてインストール。

以上!

本日のツッコミ(全44件) [ツッコミを入れる]

Before...

_ Diamond Ring [iixqobljijsp.j, http://bestdiamondrings.homestead.com/ Dia..]

_ The Lotto Black Book [yvdxmbljijsp.j, http://getthelottoblackbook.com/ The Lotto..]

_ Hgh energizer [fjwjobljijsp.j, http://buydiscounthghenergizer.net/ HGH En..]


2010/05/06(Thu) GW終了 [長年日記] 編集

_ [Ubuntu][Linux][雑記]「デスクトップ向けソフトウェアガイド」へのリンク

一応メモ。

https://forums.ubuntulinux.jp/viewtopic.php?pid=49918

時間がある時にでも確認する。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

_ Sekacepefem [consume [url=http://kaiser-permanente-p.groupsite.com]abo..]

_ Sekacepefem [complexities http://kaiser-permanente-p.groupsite.com abo..]

_ EffiplyVial [groundwater ]


2010/05/08(Sat) グッドだー [長年日記] 編集

_ [Windows][Zaurus][雑記]Zaurusのデフォルトプレイヤーで見れる動画に変換する(携帯動画変換君)

*携帯動画変換君は、どうやらVistaでは動かない模様(頑張ればできる?)。なので、VirtualPC上のXPでやった。

1. 携帯動画変換君(3GP Converter)[http://mobilehackerz.jp/contents/3GPConv]をDL

2. 無料の方のQuickTimeをダウンロード(http://www.apple.com/jp/quicktime/download/win.html)&インストール

3. 携帯動画変換君を解凍し、「setup.exe」を実行。【SD-VIDEO(ASF)形式(ISO MPEG4+G.726音声のデータを出力)】を選ぶ

4. 変換設定で、【QVGA高画質15fpsモノラル】を選択。

5. ドラッグ&ドロップで変換開始。

後は出来上がったのをZaurusに移すだけー。

以上!


2010/05/10(Mon) がはは [長年日記] 編集

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記][OpenCV] coriander(IEEE1394カメラ用のソフト)をUbuntu(debian)にインストール

まず、ココ(http://damien.douxchamps.net/ieee1394/coriander/)からソースをDL。

解凍し、その中で、

 $ ./configure

をして、必要と言われたものをapt-getとかで入れていく。

 $ sudo apt-get install libgnomeui-dev

 $ sudo apt-get install libxv-dev

 $ sudo apt-get install libraw1394-dev

 $ sudo apt-get install libdc1394-13-dev

 $ sudo apt-get install libsdl-dev

 $ sudo apt-get install ftplib-dev

後は、

 $ make
 $ sudo make install

すればOK!

OpenCVでIEEE1394カメラとかを使いたい場合も、先にこれを入れておくと、環境がすべて揃うので便利!

_ [Ubuntu][Linux][Debian][研究関係][プロジェクト実習][OpenCV]opencvでieee1394を使う改

まずはcorianderを入れる。(上のを参照)

(./configureで要求されるものをすべて揃える。)

その後OpenCVをインストール。

以前の日記(http://robotics.naist.jp/~akihiro-i/dialy/?date=20090912#p05)で、apt-getで入れる方法も書いたが、 やっぱり、apt-getだとIEEE1394カメラを読み込める環境が整わない模様。

なので、少々面倒だが、ココ(http://sourceforge.net/projects/opencvlibrary/files/)からソースをDLして、

 $ tar zxvf opencv-1.1pre1.tar.gz
 $ cd opencv-1.1.0
 $ ./configure
 $ make
 $ sudo make install
 $ sudo ldconfig

とした方がいい。手抜きしようとした結果、小一時間ほど無駄にしてしまった・・・。

(注1)

libdc1394は古い方(1.3)を入れること!

そうしないとopencvに認識されないっぽい?(これは微妙。今回、2.2でも動いた)

(注2)

IEEE1394が/dev/video1394-0になってしまっているときは、mvでこれを/dev/video1394/0に移すべし!(これは今回も起きた)

(注3)

サンプルは/usr/share/doc/opencv-doc/examples/cに入るっぽい。

コンパイルは

 $ sh build_all.sh

で出来る。後は「lkdemo」辺りを起動させてカメラからキャプチャできるか試すべし。

(注4)

OpenCVのコンパイル例

コンパイル例

$ g++ -Wall -O2 `pkg-config --cflags opencv` `pkg-config --libs opencv` -o 1394test 1394test.cpp

(補足)

ココ(http://www.netaro.info/techinfo/Linux/FirewireCamera/firewireCamerawithLinux.html)とか見るとおもしろい。

間違ってデバイスファイルを消してしまったときとかにも参考になる。


2010/05/11(Tue) お部屋をお連れします [長年日記] 編集

_ [Ubuntu][FC][Linux][雑記][研究関係] シェルスクリプトで注意すべきこと(/bin/shの秘密)(某interfaceな会社のADボード用ドライバのインストール時に起きたトラブルの原因)

*某interfaceな会社のADボード用ドライバのインストールで苦しめられたので、その原因をメモっておく。

大抵のシェルスクリプトでは、ファイルの先頭に、

 #!/bin/sh

という記述がされていると思う。

が、しかし!

最近のLinuxでは、/bin/shをシンボリックリンクとし、「bourn shell」そのものではなく、「bash」等の別のシェルを実体として使っているものが多い。

*シンボリックリンクの確認は以下のコマンドで出来る。

 $ ls -l /bin/sh

加えて、「bash」は「/bin/sh」として呼び出された場合も、「bash」で拡張された機能をそのまま使うことが出来る。

この影響で、「/bin/shを使うようにshebangが指定されているにもかかわらず,実際にはbashでなければ動かない」という困ったものが混ざっていることがある。

更に、一部のディストリビューションでは「ash」が「/bin/sh」の実体として使われることもあり、特に、Debian系のディストリビューションでは、Debian版のashである「Debian Almquist Shell (dash)」が使われている。

で、なぜこんなことを書くかというと、某ADボード用ドライバのインストールスクリプトが、「bash」であることを前提にかかれており、マニュアルどおりのコマンド

 $ sudo sh install

ではうまく動かなかったからである。

*Ubuntuは、「/bin/sh」に「dash」がシンボリックリンクされているが、デフォルトのログインシェルは「bash」という妙な仕様になっている。

これの対処法としては、

方法1.

 $ sudo bash install

と、「bash」で実行する。

方法2.

シェルスクリプトの先頭の

 #!/bin/sh

 #!/bin/bash

とし、

 $ sudo ./install

と、実行ファイルとして実行する。

方法3.パイプからの入力を標準出力と指定ファイルに書き出す

/bin/shをbashのシンボリックリンクに差し替えてしまう。

まず、以下のコマンドを実行。

 $ sudo dpkg-reconfigure dash

実行すると「Install dash as /bin/sh?」と確認されるので、<いいえ>を選択。

これで、「dash」の代わりに「bash」が使われるようになる。

*自分のおすすめは「方法3」。個人的に「dash」はちょっと・・・。

まあ、「/bin/sh」を指定しておいて、「bash」でしか動かないようなものを書くのがそもそも間違いだと思うがな!

参考:

http://gihyo.jp/admin/serial/01/ubuntu-recipe/0018?page=2

http://ja.wikipedia.org/wiki/Bourne_Shell

http://ja.wikipedia.org/wiki/Bash

http://ja.wikipedia.org/wiki/Almquist_Shell

_ [Ubuntu][FC][Linux][雑記][研究関係]パイプからの入力を標準出力と指定ファイルに書き出す(tee)

普通に出力をファイルにリダイレクトしてしまうと、画面上で処理過程を見ることができない。

なので、make等を行う際には、

 $ make |& tee tmp4make (csh・tcsh の場合)
 $ make 2>&1 | tee tmp4make (sh・bash の場合)

とする。これだと、コンパイル結果を画面で確認しつつ、ファイル make-log にコンパイルの過程を書き込むことができる。


2010/05/12(Wed) いあいあはすたあ [長年日記] 編集

_ [Linux][Ubuntu][FC][雑記][研究関係]pci-320416をUbuntu9.04で使う(個人用メモ)

 $ tar xvzf gpg3100_i386_040034.tgz
 $ sudo dpkg-reconfigure dash
   →No
 $ sh install
 $ tar xvzf gpg6204_i386_030015.tgz
 $ sh install

<dpg0100>

 $ cd /usr/src/interface/common/dpg0100/src
 $ gedit Makefile
21c21
< KERNELSRC := /lib/modules/$(shell uname -r)/build
---
> KERNELSRC := /usr/src/linux-source-2.6.28
68c68
< INCLUDEDIR=$(KERNELSRC)/include
---
> INCLUDEDIR=$(KERNELSRC)/arch/x86/include
84c84
< CFLAGS += -I$(INCLUDEDIR)
---
> CFLAGS += -I$(INCLUDEDIR) -I$(KERNELSRC)/include
 $ make
 $ sudo make install

<dpg0101>

 $ cd /usr/src/interface/common/dpg0101/src
 $ gedit Makefile
21c21
< KERNELSRC := /lib/modules/$(shell uname -r)/build
---
> KERNELSRC := /usr/src/linux-source-2.6.28
68c68
< INCLUDEDIR=$(KERNELSRC)/include
---
> INCLUDEDIR=$(KERNELSRC)/arch/x86/include
84c84
< CFLAGS += -I$(INCLUDEDIR)
---
> CFLAGS += -I$(INCLUDEDIR) -I$(KERNELSRC)/include
 $ make
 $ sudo make install

モジュールのコンパイル

 $ cd /usr/src/interface/gpg3100/i386/linux/drivers/src/
 $ gedit Makefile
13c13
< KERNELSRC := /lib/modules/$(shell uname -r)/build
---
> KERNELSRC := /usr/src/linux-source-2.6.28
59c59
< INCLUDEDIR=$(KERNELSRC)/include
---
> INCLUDEDIR=$(KERNELSRC)/arch/x86/include
74c74
< CFLAGS += -I$(INCLUDEDIR)
---
> CFLAGS += -I$(INCLUDEDIR) -I$(KERNELSRC)/include
 $ make
 $ sudo make install

ドライバ組み込み(GPG-3100)

 $ cd /usr/src/interface/gpg3100/i386/linux/drivers/
 $ sh insad.sh

そもそもカーネルが対象外だった。しょぼーん。


2010/05/13(Thu) [長年日記] 編集

_ [Linux][Ubuntu][FC][Debian][研究関係][雑記] gpg3100を使う際の注意点(100513現在)

なぜか、「/usr/include/fbiad.h」の中に定義されている構造体「ADSMPLREQ」の一部が間違っているらしく、helpにかかれたサンプルコードをコンパイルするとエラーを吐く。

具体的には、「fTrigLevel1」と「fTrigLevel2」が、「fTriglevel1」と「fTriglevel2」になっている模様。

なので、

 float         fTriglevel1;
 float         fTriglevel2;

を、

 float         fTrigLevel1;
 float         fTrigLevel2;

に変更する。これで、

 $ gcc &#8211;o Adtest Adtest.c &#8211;lgpg3100

が通るようになる。

*いろいろググったが、やはり「fTrigLevel1」と「fTrigLevel2」が正しいっぽい。

・・・ヘッダが間違ってるとか、なんて致命的なっ!?


2010/05/14(Fri) [長年日記] 編集

_ [Linux][Ubuntu][FC][Debian][研究関係][雑記] Linuxからプリンタを使う(cups)

「cups」( Common UNIX Printing System )と言うのを使うのが便利。Windowsとのプリンタの共有等にも使えるっぽい。(http://www.jitaku-server.net/samba_printer.html

もし入っていない場合は、

 # apt-get install cups

 # yum install cups
 # yum install desktop-printing
 # yum install hal-cups-utils

でインストールできるはず。

インストールが済んだら、適当なブラウザで、

 http://localhost:631/

にアクセスする。

すると、GUIの設定画面が出てくるので、画面の説明にしたがって設定していく。

 1. CUPS (GUI) のトップメニュー
 2. 新規プリンタの追加
 3. プリンタ名の設定
 4. デバイスの選択
 5. ドライバのベンダー選択
 6. ドライバのモデル名の選択
 7. プリンタ設定の完了画面
 8. プリンタの詳細設定

以上!

デバイスURIについて

URIは、乱暴に言うと、URLを拡張したようなもの。

分からない場合は、設定済みのPCからコピペするか、管理者に確認する。

まあ、画面にいろいろ書いているので、その例にしたがって書けばOK。

対応するプリンタドライバーが見つからない場合

とりあえず公式HPを探す。

それでも見つからなければ、一縷の望みをかけて、Gutenprint (旧称:gimp-print-cups) を最新版にしてみる。

*Gutenprint:オープンソースプロジェクトが開発し公開しているCUPS用のプリンタドライバ

apt系の場合は

 # apt-get install gimp-print-cups

または

 # apt-get install cups-driver-gutenprint

yum系の場合は

 # yum install gimp-print-cups

でインストールできる。

参考

http://f40.aaa.livedoor.jp/~green/?HardWares%2FPrinting

http://www12.atwiki.jp/linux2ch/pages/50.html#id_302938e1

画像の説明


2010/05/17(Mon) はわわ [長年日記] 編集

_ [Windows][Debian][Ubuntu][Linux][玄箱][雑記] 玄箱(初代)をデフォルトのまま使う(EMモードの起動方法)

いまさらながら、買ってしまったのでメモ。

基本的には付属の説明書にしたがって作業すればOK。

組み立て&セットアップ

まず、説明書に従い玄箱にハードディスクを組み込む。

が、既に別のPCで使っていたハードディスクを使う場合には、先にパーティションを削除するか、なんとかして玄箱を「EM モード」にする必要がある。

環境にもよるが、おそらく以下のいずれかの方法でできる。

 - リセットボタンを長押し
 - echo -n 'NGNG' > /dev/fl3 して再起動
 - echo -n 'NGNG' > /dev/mtdblock2 して再起動

これで、付属の「KuroBoxSetup.exe」もしくは「KuroBoxUpdate.exe」を実行すれば、きちんと玄箱として発見されるはず。

あとは説明書にしたがってセットアップする。

*ファームウェアインストールで失敗する場合は、Vistaの場合は「管理者モード」で実行すれば出来る場合がある。

もしくは、ファイアーウォールを開けることで解決できるかもしれない。

各種設定

ブラウザのアドレスバーに「http://KURO-BOX/」(もしくは http://"セットアップ時に表示されたIPアドレス" )を入力することで、ブラウザ上で玄箱のセットアップを行うことが出来る。

ユーザー名・パスワードの初期値は以下の通り。

 ユーザー名:root
 パスワード:なし

セットアップ画面では以下の設定が出来る。

 ■基本設定
 ■ネットワーク設定
 ■共有フォルダ設定
 ■メンテナンス

最低限、パスワードだけは設定しておくこと!

ちなみに、telnetからも

 ユーザー名:root
 パスワード:kuro

で入ることが出来る。まあ、中身はLinuxだしね!

NASとしての機能は十分あるので、特に不便を感じなければ、このまま使えばOK!

「もっといじりたい!」

と言う場合は、debian化やらなんやら、いろいろと方法があるので、自力で茨の道を突き進むべし!

どうなっても知らんがな!

_ [FC][Debian][Ubuntu][Linux][玄箱][雑記] tab補完拡張(bash-completion、git-completion)

bashにおける[tab]キーによる補完を拡張する。

まず、

 $ apt-get install git-completion

で、git-completion(bash-completion)をインストール。

自分の環境では、そのまま設定が更新されたが、ソースから入れたりした場合は、以下の作業も必要。

bashの設定ファイル、「~/.bashrc」に以下を追記。

(「bash_completion」を「~/」にコピーした場合)

 . bash_completion

インストール場所を示す、冒頭の「.」を忘れないように!

で、設定ファイル「.bashrc」を再読み込みする。

 source ~/.bashrc

これでOK!

適当に[Tab]を押すと、今まで以上にいろいろと補完してくれる。

文字化けが起きてどうしようもないときとかに、無理やり動くのにも使えるかも?

*最近のシェルでは、zshが凄いらしい。今度試してみよう。

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記][OpenCV] OpenCV用のMakefile例

CXX = g++
CXXFLAGS = `pkg-config --cflags opencv`
LDFLAGS = `pkg-config --libs opencv`
TARGET = lkdemo
SOURCE = $(TARGET).c

TARGET:
	$(CXX) -o $(TARGET) $(SOURCE) $(CXXFLAGS) $(LDFLAGS)

.PHONY: clean
clean:
	rm -f *.o *~

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記][OpenCV] OpenCVで動画書き出し

*結果的に失敗してたので、あまり参考にしないように!

プログラムとしては、ココ(http://opencv.jp/sample/video_io.html)のサンプルのとおりで出来る。

が、OpenCV動画を扱うには「ffmpeg」に含まれる「libavcodec-dev」が必要なので、OpenCVインストール時にこれがインストールされていないと、プログラムは動くが、動画は書き出されない。

特に理由がなければ、

 $ apt-get install libavcodec-dev

でインストールできるのだが、途中で「libdc1394」を最新版に入れ替えてしまうため、IEEE1394カメラを使う場合には、tarボールを拾ってきて、手動で入れる必要がある。

ソースからインストール

まず、ffmpegに最低限必要となるものを入れておく。

 $ sudo apt-get install quilt libogg-dev libvorbis-dev liba52-dev libdts-dev libsdl1.2-dev libimlib2-dev texi2html libraw1394-dev libdc1394-13-dev libtheora-dev libgsm1-dev

全部入ったら、ココ(http://ffmpeg.org/download.html)からffmpegのソースを取ってくる。

 $ apt-get install subversion
 $ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg

で、いくつかオプションをつけて

 $ ./configure --enable-shared --enable-swscale --enable-gpl

し、

 $ make
 $ sudo make install

でインストール完了!

ibavcodec は /usr/local/lib にインストールされたはず。

もし/usr/local/lib にライブラリパスが通っていない場合は、「/etc/ld.so.conf」もしくは「/etc/ld.so.conf.d/libc.conf 」に以下の行を追加。

 /usr/local/lib

また、ヘッダファイルは「/usr/local/include/lib*」あたりに生成されると思うが、OpenCV(1.1)の場合、「ffmpeg/*.h」を探してしまうため、そのままでは認識してくれない。

なので、ffmpegディレクトリを作り、リンクを張っておく。

 $ cd /usr/local/include
 # mkdir ffmpeg
 # cd ffmpeg
 # ln -s ../lib*/*.h ./

(100519訂正)

「Makefile」の方を直すべき!

ffmpeg関係のヘッダファイルが複数見つかってエラーを吐いてた・・・

あとは、OpenCVのソースを持ってきて

 $ ./configure

を行い、「Use ffmpeg」がYesになっていることを確認して

 $ make
 # make install

すればいい。はず。

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記][OpenCV] ffmpeg-0.4.9-pre1のインストール

*結果的に失敗してたので、あまり参考にしないように!

このへん(http://www.filewatcher.com/m/ffmpeg-0.4.9-pre1.tar.gz.1611332.0.0.html)から一応DLできる。

が、どうやら、gcc3.*でないとコンパイルできない模様。

なので、

 $ apt-get install gcc-3.4

とし、

 $ ./configure --enable-shared --enable-swscale --enable-gpl --cc=gcc-3.4
 $ MAKEFLAGS="CC=gcc-3.4" make
 # make install

とする必要がある。

なお、

 gcc-3.3 -Wl,--warn-common -rdynamic -g  -o ffplay_g ffplay.o cmdutils.o -L./libavformat -lavformat -L./libavcodec -lavcodec -lm -lz -ldl -L/usr/lib -lSDL
 ffplay.o: In function `main':
 /home/hogehoge/src/ffmpeg-0.4.9-pre1/ffplay.c:1901: undefined reference to `XOpenDisplay'
 /home/hogehoge/src/ffmpeg-0.4.9-pre1/ffplay.c:1905: undefined reference to `XCloseDisplay'
 collect2: ld はステータス 1 で終了しました
 make: *** [ffplay_g] エラー 1

といったエラーが出る場合は、Makefile内でgccのオプションを指定している場所に

 -lX11

を加えればいい。

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記][OpenCV] IEEE1394とlibavcodec(ffmpeg)を同時に使う(OpenCVのインストール改改)

*結果的に失敗してたので、あまり参考にしないように!

どうも、aptで「libavcodec-dev」を入れると、「libdc1394-13-dev」を削除して「libdc1394-22-dev」に入れ替えてしまう模様。

なので、まず

 # apt-get install libavcodec-dev

とした後で、「libdc1394 1.x」のソースをここ(http://damien.douxchamps.net/ieee1394/libdc1394/)から取ってきて手動で入れる必要がある。

*依存関係とかが怪しくなりそうなので、あくまで自己責任で!

このへん(http://sourceforge.net/projects/libdc1394/files/)にある「libdc1394 1.2.2」あたりをいれれば動くと思う。

インストールは「./configure」「make」「make install」のいつものでOK。

あとはOpenCVの「./configure」で両方使えることが確認できればいい。はず。


2010/05/18(Tue) あわわ [長年日記] 編集

_ [Windows][Linux][Ubuntu][Debian][FC][研究関係][雑記][gnuplot]gnuplotの使い方メモその0(サンプル)

こんな感じで。

 plot [:][0.5:1.3] "gplotdata.dat" using 1:2 w l,  "gplotdata.dat" using 1:3 w l

_ [Windows][Linux][Ubuntu][Debian][FC][研究関係][雑記][gnuplot]gnuplotの使い方メモその1(グラフを画像として出力)

こんな感じで。

 gnuplot> set terminal png
 gnuplot> set output "sin.png"
 gnuplot> plot sin(x) w l
 gnuplot> set output "cos.png"
 gnuplot> plot cos(x) w l

どうも、連続してグラフを出力する場合、プロットの度に「set output」が必要な模様。

元にもどすときは、

Linuxの場合

 gnuplot> set terminal x11
 gnuplot> plot sin(x) w l

Windowsの場合

 gnuplot> set terminal windows
 gnuplot> plot sin(x) w l

とする。

うむ、面倒!

_ [Linux][雑記]anthyのひどい誤変換

 「セッティング」→「殺ティン具」

さすがanthy!

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記] Linuxでpdfを結合・分解する(pdftk)

「pdftk」というツールキットを使えば、コマンドラインで簡単に編集できるらしい。

さすがLinux!

インストール

ソースがここ(http://www.accesspdf.com/pdftk/)にあるらしいのだが、HPの構造がよくわからない。

なので、aptやyumでさくっとインストールしよう。

 # yum install pdftk
 # apt-get install pdftk

分割

分割の書式はこんな感じ。

 $ pdftk 対象のPDFファイル cat ページ範囲 output 出力先のPDFファイル

例えば、 「hoge.pdf」 というPDFファイルの2-3ページ目を取り出して 「p2-3.pdf」 というファイルを作成するなら、以下のようにする。

 $ pdftk sample.pdf cat 2-3 output 2-3.pdf

もちろん単一ページでも取り出せるし、「6-end」(7ページ目から最終ページまで)のような指定もできる。

また、「2-3 6-end」(全体から6ページだけを取り除く)のような指定も可能。

結合

結合の書式はこんな感じ。

 $ pdftk 結合するPDFファイル cat output 出力先のPDFファイル

例えば、「1.pdf」と「2.pdf」を結合して「12.pdf」というファイルを作成する場合、

 $ pdftk 1.pdf 2.pdf cat output 12.pdf

とすればいい。

ワイルドカードも使える。

 $ pdftk *.pdf cat output out.pdf

その他の機能

 $ pdftk -h

で調べれ。


2010/05/19(Wed) 2%ー [長年日記] 編集

_ [Linux][Ubuntu][Debian][FC][研究関係][雑記][OpenCV] OpenCVで録画をする際にエラーが出る原因(ffmpegがエラーを吐く)

具体的にはこんなエラー。

 /usr/lib/i686/cmov/libavformat.so.52: no version information available (required by /usr/local/lib/libhighgui.so.2.1)

これはどうも、vlcなどの動画プレイヤーを入れる際にaptが勝手に「libavformat」やらなんやらをインストールしてしまうのが原因っぽい。

複数それっぽいのがヒットしてしまっておかしくなる模様。

*vlcをremoveしたら、一緒にそれらが削除されて正常に動くようになった。

自分の場合、OpenCVで動画を録画するために、「ffmpeg」をソースからコンパイルしてインストールした(いろいろconfigureの設定が必要だったので)結果、こういうことになってしまっていた。

なので、「ffmpeg」を手動で入れたり、OpenCVで動画を録画したりしている場合は「libav*」が勝手に入ったりしないように注意すべし!

まあ、もっときちんと管理すれば問題なく共存できる気もするがな!

*コーデックの問題はWindowsでもよく起きるし、あまりこれ以上触りたくない・・・。下手にいじったらすべてがおかしくなりそうな気がするし。

*放置した結果、今は録画用PCと再生用PCが別になってます。うん、烈めんどう!

*とりあえず、きちんと出力できていることを確認するために、「mplayer」をソースからコンパイルして入れた。

まあ、エラーが出なかったので、最低限これでいいかなー。


2010/05/20(Thu) ゴッチャリオン [長年日記] 編集

_ [OpenCV][Linux][Ubuntu][Debian][FC][研究関係][雑記] OpenCV + IEEE1394カメラ + ffmpeg インストールまとめ( + mplayer)

' とりあえず、以前までのffmpeg関係の日記は無視してください!間違い多数故 '

ffmppeg

まず、ffmpegに最低限必要となるものを入れておく。

 $ sudo apt-get install quilt libogg-dev libvorbis-dev liba52-dev libdts-dev libsdl1.2-dev libimlib2-dev texi2html libraw1394-dev libdc1394-13-dev libtheora-dev libgsm1-dev

全部入ったら、ココ(http://ffmpeg.org/download.html)からffmpegのソースを取ってくる。

 $ apt-get install subversion
 $ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg

で、いくつかオプションをつけて

 $ ./configure --enable-shared --enable-swscale --enable-gpl

し、

 $ make
 # make install
 # sudo ldconfig

でインストール完了!

これでlibavcodec等が /usr/local/lib にインストールされたはず。

もし/usr/local/lib にライブラリパスが通っていない場合は、「/etc/ld.so.conf」もしくは「/etc/ld.so.conf.d/libc.conf 」に以下の行を追加する。

/usr/local/lib

また、ヘッダファイルは「/usr/local/include/lib*」あたりに生成されると思うが、OpenCV(1.1)の場合、「ffmpeg/*.h」を探してしまって認識してくれない可能性がある。

その時は、OpenCVのMakefileを修正する。

*シンボリックリンクで、

 $ cd /usr/local/include
 # mkdir ffmpeg
 # cd ffmpeg
 # ln -s ../lib*/*.h ./

とすると、ffmpeg関係のヘッダファイルが複数見つかってエラーを吐いたので。

IEEE1394カメラ

まず、ココ(http://damien.douxchamps.net/ieee1394/coriander/)からソースをDLし、解凍して

 $ ./configure

いろいろ足りないといわれるので、適宜、必要と言われたものをapt-getで入れていく。

 $ sudo apt-get install libgnomeui-dev
 $ sudo apt-get install libxv-dev
 $ sudo apt-get install libraw1394-dev
 $ sudo apt-get install libdc1394-13-dev
 $ sudo apt-get install libsdl-dev
 $ sudo apt-get install ftplib-dev

エラーが完全になくなったのを確認し、

 $ make
 $ sudo make install

これでインストールは完了!実際にIEEE1394カメラを接続し、

 $ ls /dev/video1394*

として、それっぽいのが出来ていること確認する。もし出来ていれば

 # coriander

とすれば、IEEE1394カメラが動くはず。(管理者権限が必要?)

*もしcorianderでもうごかないなら、もう一度configureし、確認する。

<注1>

libdc1394は古い方(1.3)を入れること!

そうしないとopencv(1.x)で認識できないっぽい。

<注2>

IEEE1394が/dev/video1394-0になってしまっているときは、mvでこれを/dev/video1394/0に移すべし!

*これもopencv(1.x)対策。

*なぜ「video1394-0」になるのかは、自分でググってください。

OpenCV

ココ(http://sourceforge.net/projects/opencvlibrary/files/)からソースをDLして、

1.xの場合
$ tar zxvf opencv-1****.tar.gz
$ cd opencv-1*****
$ ./configure
$ make
# make install
# ldconfig
2.xの場合
$ tar zxvf opencv-2****.tar.gz
$ cd opencv-2*****
$ cmake .
$ make
# make install
# ldconfig

とする。

この際、「./configure」もしくは「cmake .」としたときに、「ieee1394」と「ffmpeg」が有効になっていることを確認すること!

この時点で正しく設定できていない場合、後で再インストールするはめになります。

IEEE1394カメラを試す

サンプルソース(aptでdocを入れた場合、/usr/share/doc/opencv-doc/examples/cに入っている)を

 $ sh build_all.sh

でコンパイルし、「lkdemo」を'管理者権限で'起動させる。

これでIEEE1394カメラからキャプチャできることが確認できる。

録画(ビデオアウトプット)を試す

とりあえずここ(http://opencv.jp/sample/video_io.html)から「動画としてファイルへ書き出す」というサンプルコードを取ってきて、こんな感じ

 $ g++ -Wall -O2 `pkg-config --cflags opencv` `pkg-config --libs opencv` -o 1394test 1394test.cpp

でコンパイルする。

出来上がった実行ファイルを'管理者権限で'起動し、エラー無しにcap.aviが生成されることを確認する。(「ctl+c」で終了させてもちゃんと生成されるっぽい?)

*以下、解説から引用。

コーデックの指定に,CV_FOURCC('X','V','I','D')(XVID)を用いているが,リファレンス マニュアルにあるように,CV_FOURCC('M','J','P','G')(モーションJPEG)や CV_FOURCC('P','I','M','1')(MPEG-1)を利用することもできる.非圧縮での保存を希望する場合は,CV_FOURCC('D','I','B',' ')を指定すればよい.

mplayerをソースからインストール

ココ(http://robotics.naist.jp/~akihiro-i/dialy/?date=20100519#p01)でも書いたが、どうもコーデック関係が怪しい。

なので、コーデック内蔵の「mplayer」をソースからコンパイルし、インストールする。

ここ(http://www.mplayerhq.hu/design7/dload.html)からソースをDLし、解凍して

 $ ./configure
 $ make
 # make install

するだけ!

実行も

 $ mplayer hoge.avi

とかで簡単に出来る。

まあ、CUIでしか起動できないっぽいが、とりあえず使えるだろう。

*aptで入れると「libav*」が大量にインストールされてしまい、競合が起きて「ffmpeg」がエラーを吐いた・・・


2010/05/21(Fri) ベームベーム [長年日記] 編集

_ [Linux][Ubuntu][Debian][FC][C++][研究関係][雑記] Linux上で、C言語(C++)を使ってマルチスレッドプログラミングする話(pthread,mutex)

自分がプログラミングに使うのは、基本的にLinuxだけなので、pthreadを使うのが主。

manを引用すると、

POSIX.1 は、一般に POSIX スレッドや Pthreads として知られるスレッド・プログラミングのインタフェース群 (関数、ヘッダファイル) を規定している。一つのプロセスは複数のスレッドを持つことができ、全てのスレッドは同じプログラムを実行する。これらのスレッドは同じ大域メモリ (データとヒープ領域) を共有するが、各スレッドは自分専用のスタック (自動変数) を持つ。 POSIX.1 はスレッド間でどのような属性を共有するかについても定めている (つまり、これらの属性はスレッド単位ではなくプロセス全体で共通である):

とのこと。

久々にマルチスレッドプログラミングにチャレンジしたので、実際にどう使うのかを簡単に書いておく。最低限、これだけ出来ればある程度対応できるはず。

*コンパイルには「-lpthread」が必要。

 #include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>

 typedef struct {
     char *c;
     int  i;
 }   St;

 void *thread_func1()
 {
     printf("0\n");
     return NULL;
 }
 void *thread_func2(void *arg)
 {
     int i = (int)arg;
     printf("%d\n",i);
     return NULL;
 }
 void* thread_func3(void *arg)
 {
      St *st = (St*)arg;
      printf("%d %s\n", st->i, st->c);
 }

 int main(void)
 {
     int i=1;
     St st;
     st.c = "struct";
     st.i = 100;

     pthread_t thread1;
     pthread_t thread2;
     pthread_t thread3;

     if (pthread_create(&thread1, NULL, thread_func1, (void *)NULL) != 0)
     { return EXIT_FAILURE; }
     if (pthread_create(&thread2, NULL, thread_func2, (void *)i) != 0)
     { return EXIT_FAILURE; }
     if (pthread_create(&thread3, NULL, thread_func3, (void *)&st) != 0)
     { return EXIT_FAILURE; }

     if (pthread_join(thread1, NULL) != 0)
     { return EXIT_FAILURE; }
     if (pthread_join(thread2, NULL) != 0)
     { return EXIT_FAILURE; }
     if (pthread_join(thread3, NULL) != 0)
     { return EXIT_FAILURE; }

     return EXIT_SUCCESS;
 }

上の例だと問題ないが、マルチスレッドでは、同じ変数に同時にアクセスするということが起こり得る。

そこで、「mutex」という考え方を導入する。

簡単に言うと、あるスレッドでロックした「mutex」に対し,別のスレッドがロックしようとすると、そのmutexを開放するまで待機させられるという仕組み。 Wikipediaとかにも載っているので、詳細は省く。

具体的には、こんな感じで使う。

 #include <stdio.h>
 #include <stdlib.h>
 #include <pthread.h>
 #include <unistd.h>

 volatile int cnt;
 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 void *add1()
 {

     int i;
     for(i=0; i<10; i++)
     {
       pthread_mutex_lock(&mutex);      	/* mutex ロック */
         cnt = cnt +1;
         printf("locked:1 ",cnt);
       pthread_mutex_unlock(&mutex);   	/* mutex アンロック */
       printf("%d\n",cnt);
       usleep(400);
      }
     return NULL;
 }
 void *add2()
 {
     int i=0;
     for(i=0; i<10; i++)
     {
       pthread_mutex_lock(&mutex);      	/* mutex ロック */
         cnt = cnt +2;
         printf("locked:2 ",cnt);
       pthread_mutex_unlock(&mutex);   	/* mutex アンロック */
       printf("%d\n",cnt);
       usleep(300);
     }
     return NULL;
 }

 int main(void)
 {
     pthread_t thread1;
     pthread_t thread2;
     pthread_mutex_init( &mutex, NULL ); //mutexを初期化

     if (pthread_create(&thread1, NULL, add1, (void *)NULL) != 0)
     { return EXIT_FAILURE; }
     if (pthread_create(&thread2, NULL, add2, (void *)NULL) != 0)
     { return EXIT_FAILURE; }

     if (pthread_join(thread1, NULL) != 0)
     { return EXIT_FAILURE; }
     if (pthread_join(thread2, NULL) != 0)
     { return EXIT_FAILURE; }

     return EXIT_SUCCESS;
 }

あと、グローバル変数等を使っている場合、コンパイラによって最適化されてしまう可能性があるので、「volatile」をつけるほうがいいと思われ。

かなり乱暴な説明だが、とりあえずこんな感じで。

もっと知りたかったら、このへん(http://www.cs.tsukuba.ac.jp/~yas/sie/pdsoft-2000/2001-01-18/)とかを見ればいいかもね。

_ [Linux][Ubuntu][Debian][FC][C++][研究関係][雑記] Linux上で、C++を使ってマルチスレッドプログラミングする話2(boost)

先ほど知ったのだが、「pthread」では、メンバ関数をスレッド化出来ない模様。

正確には、staticメンバ関数であれば、pthread_createの引数に出来るのだが、それはなんか気持ち悪い。

そこで、「boost」に含まれる「boost::thread」を試してみた。

まずはインストール。

 # aptitude install libboost-dev
 # ldconfig

で、こんな感じに書く。

*コンパイルには「-lboost_thread」が必要

 #include <iostream>
 #include <boost/thread.hpp>
 #include <boost/bind.hpp>
 using namespace std;
 using namespace boost;

 // メンバ関数をマルチスレッドで実行

 class bThread
 {
 private:
   int cnt;
   mutex mt;
 public:
   bThread(){cnt=0;}
   ~bThread(){}
   void *add1()
   {
       for(int i=0; i<10; i++)
       {
         usleep(400);
       mutex::scoped_lock look(mt);      	/* mutex ロック */
         cnt = cnt +1;
         printf("locked:1 ",cnt);
         printf("%d\n",cnt);
        }
       return NULL;
   }
   void *add2()
   {
       for(int i=0; i<10; i++)
       {
         usleep(300);
       mutex::scoped_lock look(mt);      	/* mutex ロック */
         cnt = cnt +2;
         printf("locked:2 ",cnt);
         printf("%d\n",cnt);
       }
       return NULL;
   }
 };

 int main(int argc, char **argv)
 {
   bThread thr;

   thread test1( bind(&bThread::add1, &thr) );
   thread test2( bind(&bThread::add2, &thr) );

   test1.join();
   test2.join();
   return 0;
 }

threadには引数は渡せず、bindというのを使って、変数をやりとりするらしい。

また、mutex::scoped_lockってのでmutexをロックできるのだが、アンロックが見当たらない。というのも、デストラクタでアンロックするらしく、スコープを抜けるとロックが解ける仕様らしい。

・・・なんか、これも気持ち悪いなぁ。

まあ、自分が使いこなせていないだけというのもあるが。

とりあえず、これだけメモっておこう。

*参考にしたサイト

http://www.yukun.info/blog/2008/07/boost-thread-mutex-condition.html

_ [Linux][Ubuntu][Debian][FC][OpenCV][C++][研究関係][雑記] Linux上で、C++を使ってマルチスレッドプログラミングする話3(pthreadでstaticでないメンバ関数をスレッド化する方法) + OpenCVのビデオIOをクラス化して動かす

参考にさせていただいたページ:

http://b-51.hp.infoseek.co.jp/programing.html

http://d.hatena.ne.jp/kasei_san/20070612/p1

ざっくりいうと、staticなメンバ関数を間に噛ませることで、非スタティックな関数をスレッドとして動くようにしようというのが本手法。

絶対、自分ではこんなの思いつかないや。もっと精進しよう。

で、自分でも使ってみたのが次のコード。

OpenCVを使っていたりして、サンプルとしてはかなりひどい。

が、めんどうなので、とりあえずこれでいく。

 #include <cv.h>
 #include <highgui.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "fbiad.h"
 #include <fstream>
 #include <string>
 #include <iomanip>
 #include <pthread.h>
 #include <iostream>

 extern "C"
 {
     typedef void* (*ThreadFunc_t)(void*);
 }

 static pthread_mutex_t mutex;  //同期用にmutexを確保

 using namespace std;

 /* IEEE1394Camera用クラス */
 class IEEE1394Camera
 {
 private:
   CvCapture *capture;
   IplImage *frame;
   CvVideoWriter *vw;
   double w, h;
   int c, num;
   CvFont font;
   char str[64];

 public:
   /* コンストラクタ */
   IEEE1394Camera(int index)
   {
     w = 320, h = 240;
     num = 0;
     capture = cvCaptureFromCAM (index);
   }
   /* デストラクタ */
   ~IEEE1394Camera()
   {
     cvReleaseCapture (&capture);
   }
   /* スレッド起動用静的メンバ関数 */
   static void* video_thread(void *arg)
   {
     int v_index = (int)arg;
     IEEE1394Camera Ccam(v_index);
     Ccam.video_io();
     return NULL;
   }
   /* 実際にスレッドで動かしたい関数 */
   void* video_io ()
   {
     //キャプチャサイズを設定
     cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
     cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
     //ビデオライタ構造体を作成
     vw = cvCreateVideoWriter ("cap.avi", CV_FOURCC ('X', 'V', 'I', 'D'), 15, cvSize ((int) w, (int) h));
     cvInitFont (&font, CV_FONT_HERSHEY_COMPLEX, 0.7, 0.7);
     cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
     printf("video_get_ready...\n");
   pthread_mutex_lock( &mutex ); //mainでロックされているので、開放されるまで待機
   pthread_mutex_unlock( &mutex );
     //カメラから画像をキャプチャし,ファイルに出力
     while (1) {
       frame = cvQueryFrame (capture);
       snprintf (str, 64, "%03d[frame]", num);
       cvPutText (frame, str, cvPoint (10, 20), &font, CV_RGB (0, 255, 100));
       cvWriteFrame (vw, frame);
       cvShowImage ("Capture", frame);
       num++;
       c = cvWaitKey (10);
       if (c >= 0)
         break;
     }
     //書き込みを終了し,構造体を解放
     cvReleaseVideoWriter (&vw);
     cvDestroyWindow ("Capture");
     return 0;
   }
 };

 /* メイン関数 */
 int main(int argc, char **argv)
 {
   int cam_index;
   if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
     cam_index = (argc == 2 ? argv[1][0] - '0' : 0);

 pthread_mutex_init( &mutex, NULL ); //mutexを初期化
 pthread_mutex_lock( &mutex ); //mutexにlockをかける
   pthread_t video_t;
   pthread_create( &video_t, NULL, (ThreadFunc_t)IEEE1394Camera::video_thread, (void *)cam_index );
   getchar();  //キー入力を待つ
 pthread_mutex_unlock( &mutex ); //lockを解除
   pthread_join( video_t, NULL );
 pthread_mutex_destroy(&mutex);          /*  ミューテックス破棄  今のLinuxでは意味はないが念のため */
   return 0;
 }

ここで重要なのは、

 extern "C"
 {
     typedef void* (*ThreadFunc_t)(void*);
 }

   /* スレッド起動用静的メンバ関数 */
   static void* video_thread(void *arg)
   {
     int v_index = (int)arg;
     IEEE1394Camera Ccam(v_index);
     Ccam.video_io();
     return NULL;
   }
   /* 実際にスレッドで動かしたい関数 */
   void* video_io ()

   pthread_create( &video_t, NULL, (ThreadFunc_t)IEEE1394Camera::video_thread, (void *)cam_index );

の部分。

*こちら(http://b-51.hp.infoseek.co.jp/programing.html)の手法をそのまま使わせてもらいました。

まず、staticメンバ変数であれば、pthread_createでスレッドとして起動できるので、「スレッド起動用静的メンバ関数」を準備。

が、UNIXの場合pthread_create(POSIX準拠のスレッドライブラリでスレッドを構築する関数)は型として「extern "C" void*(*)(void*)」を要求するため、型が違うというエラーが出る。

なので、C言語形式にリンケージ指定する必要があるが、メンバ関数にはextern "C"が使えない。そこで、

こちら(http://b-51.hp.infoseek.co.jp/programing.html

で紹介されている、typedefを使った回避方法を使わせていただいた。

以下引用。

以下のようにextern "C"付きでtypedefするとそのtypedefされたシンボルはC言語リンケージ指定までを含みます。

extern "C"
{
  typedef void* (*ThreadFunc_t)(void*);
}
    ・
    ・
    ・
  sts = pthread_create(&tid,NULL,(ThreadFunc_t)CTest::ThreadEntry,this);

これはThreadFunc_tという型名に「extern "C" void*(*)(void*)」(戻り値がvoid*で引数がvoid*一つのCリンケージ指定関数へのポインタ)という意味を持たせます。 ですので、最後の行のようにstaticメンバ関数をこの型名でキャストして渡してあげればワーニングも出ることなく、スレッドのエントリポイントにメンバ関数が使えます。

あとは「スレッド起動用静的メンバ関数」に実際にスレッドの実効処理を行うのは別のメンバ関数を呼び出す処理を書けばOK!

うーむ、なんというか、凄いな。

意外と綺麗にまとまってる。自分としては、これが一番スマートな気がする。

_ [Linux][Ubuntu][Debian][FC][OpenCV][C++][研究関係][雑記] Linux上で、C++を使ってマルチスレッドプログラミングする話3改(略)

引数としてクラスのポインタを渡して実行させるようにした。

汎用性を考えると、こっちのほうがいいと思われ。

 #include <cv.h>
 #include <highgui.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "fbiad.h"
 #include <fstream>
 #include <string>
 #include <iomanip>
 #include <pthread.h>
 #include <iostream>

 extern "C"
 {
     typedef void* (*ThreadFunc_t)(void*);
 }

 static pthread_mutex_t mutex;  //同期用にmutexを確保

 using namespace std;

 /* IEEE1394Camera用クラス */
 class IEEE1394Camera
 {
 private:
   CvCapture *capture;
   IplImage *frame;
   CvVideoWriter *vw;
   double w, h;
   int c, num;
   CvFont font;
   char str[64];

 public:
   /* コンストラクタ */
   IEEE1394Camera(int index)
   {
     w = 320, h = 240;
     num = 0;
     capture = cvCaptureFromCAM (index);
   }
   /* デストラクタ */
   ~IEEE1394Camera()
   {
     cvReleaseCapture (&capture);
   }
   /* スレッド起動用静的メンバ関数 */
   static void* video_thread(void *arg)
   {
     IEEE1394Camera* Ccam = (IEEE1394Camera*)arg;
     Ccam->video_io();
     return NULL;
   }
   /* 実際にスレッドで動かしたい関数 */
   void* video_io ()
   {
     //キャプチャサイズを設定
     cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
     cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
     //ビデオライタ構造体を作成
     vw = cvCreateVideoWriter ("cap.avi", CV_FOURCC ('X', 'V', 'I', 'D'), 15, cvSize ((int) w, (int) h));
     cvInitFont (&font, CV_FONT_HERSHEY_COMPLEX, 0.7, 0.7);
     cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
     printf("video_get_ready...\n");
   pthread_mutex_lock( &mutex ); //mainでロックされているので、開放されるまで待機
   pthread_mutex_unlock( &mutex );
     //カメラから画像をキャプチャし,ファイルに出力
     while (1) {
       frame = cvQueryFrame (capture);
       snprintf (str, 64, "%03d[frame]", num);
       cvPutText (frame, str, cvPoint (10, 20), &font, CV_RGB (0, 255, 100));
       cvWriteFrame (vw, frame);
       cvShowImage ("Capture", frame);
       num++;
       c = cvWaitKey (10);
       if (c >= 0)
         break;
     }
     //書き込みを終了し,構造体を解放
     cvReleaseVideoWriter (&vw);
     cvDestroyWindow ("Capture");
     return 0;
   }
 };

 /* メイン関数 */
 int main(int argc, char **argv)
 {
   int cam_index;
   if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
     cam_index = (argc == 2 ? argv[1][0] - '0' : 0);
   IEEE1394Camera Ccam(cam_index);

 pthread_mutex_init( &mutex, NULL ); //mutexを初期化
 pthread_mutex_lock( &mutex ); //mutexにlockをかける
   pthread_t video_t;
   pthread_create( &video_t, NULL, (ThreadFunc_t)IEEE1394Camera::video_thread, (void *)&Ccam );
   getchar();  //キー入力を待つ
 pthread_mutex_unlock( &mutex ); //lockを解除
   pthread_join( video_t, NULL );
 pthread_mutex_destroy(&mutex);          /*  ミューテックス破棄  今のLinuxでは意味はないが念のため */
   return 0;
 }

コンパイルはこんな感じで。

 $ g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` pthread_video_io_2.cpp
本日のツッコミ(全1件) [ツッコミを入れる]

_ メロン [はじめまして いつも黙って拝見させて頂いてますm(_ _)m 私も今、IEEE1394カメラからDIVXで録画するの..]


2010/05/27(Thu) メビウスジェイド [長年日記] 編集

_ [Linux][Ubuntu][Debian][FC][C++][研究関係][雑記]FFTWを使う

データ処理でフーリエ変換をしたいのだが、自分で書くのは面倒くさい。

liboctaveを入れてもいいのだが、どうも中で動いているのはfftwっぽい。

なので、直接fftwをインストールして使うことにする。

ここ(http://www.fftw.org/)からソースをDL。

で、解凍し./configure。

ここで、「--enable-threads」をつけるとスレッドでつかえるようになる。

また、デフォルトの精度はdouble(倍精度)だが、単精度の浮動小数点数で計算したい場合は「--enable-float」を設定出来る。

環境によっては、「--enable-long-double」を設定することで、4倍精度での浮動小数点数で計算出来る。

※ 「--enable-float」のときは,「--enable-sse」を付けると高速化が期待できる(SSE 付きのプロセッサのみ)

なので、こんな感じでインストールする。

double

 $ ./configure --enable-threads
 $ make
( $ make check )
 $ sudo make install
 $ sudo ldconfig

float

 $ ./configure --enable-threads --enable-float --enable-sse
 $ make
( $ make check )
 $ sudo make install
 $ sudo ldconfig

普通に--enable-floatオプション有りと無しでconfigure、make、make installすると、libfftw3とlibfftw3fの両方をインストール可能。

「libfftw3」がdouble版、「libfftw3f」がfloat版。

コンパイルはこんな感じで。

double

 $ gcc -lm -lfftw3 -o hoge hoge.c

float

 $ gcc -lm -lfftw3f -o hoge hoge.c

それぞれ別のライブラリを使うので注意!

また、ソースの方も、関数や型名をdouble時の

 fftw_****

から

 fftwf_****

に置き換えなくてはならない。

*置き換えなくてはならないものの詳細は不明。やって見てエラーが出たら直すでいいかと

*とりあえず、大文字のFFT****は置き換えなくてOKっぽい。

あとは、このへん(http://www32.atwiki.jp/amaeda/)を見ながら頑張るべし!

以上!


2010/05/28(Fri) 五郎入道政宗! [長年日記] 編集

_ [Linux][Ubuntu][Debian][FC][C++][研究関係][雑記]stringstreamの話(stringを使った文字列の操作)

プログラムで連続したファイル名を生成したい場合等に便利。

こんな感じで使う。

 #include<iostream>
 #include<sstream>
 int main( int argc, char **argv )
 {
   std::stringstream ss;
   for( int i=0; i<10; i++ ){
     ss.str("");
     ss << "hogehoge" << i+1 << ".dat";
     std::cout << ss.str() << std::endl;
   }
   return 0;
 }

毎回、str("")で初期化しないと、stringstreamのバッファが残ってしまい、ファイル名がつながってしまうっぽい。

*strはバッファに文字列を代入する関数なので、空を代入することで初期化できる。

*というか、.ckear()というそれっぽいメンバ関数を持ちながら、単にストリームのエラーフラグをクリアするためのものってのは、凄く分かりにくい。

まあ、下のみたいな使い方をすれば、バッファの初期化などそもそも不要な気もするが。

 #include<iostream>
 #include<sstream>
 using namespace std;
 int main( int argc, char **argv )
 {
   for( int i=0; i<2; i++ )
   {
     FILE *fpw;
     stringstream ss;

     string filename;
     ss << "hoge" << i+1 << ".dat";
     filename = ss.str();
     if ((fpw = fopen(filename.c_str(), "w")) == NULL)
     {
       printf("file open error!!\n");
       return(-1);
     }
   }
   return 0;
 }

_ [gnuplot][Windows][Linux][Ubuntu][Debian][FC][C++][研究関係][雑記]手軽にスペクトログラムを作成する(gnuplotを使う)

*高確率で間違った情報が混ざっています。気をつけてください。

とりあえず、入力信号にフーリエ変換をかけるプログラムは、FFTWを使えば簡単に出来ると思う。

*ここ(http://www32.atwiki.jp/amaeda/)とかが詳しい。

なので、それを応用して、適当なデータ数(256とか512ぐらい)の長さで区切った短時間フーリエ変換(STFT)を時間毎に行うようなプログラムを書き、その結果をファイルに書き出せるようにする。

ファイルへのデータ出力は、

 時間  周波数 強さ

の順で並べておく。

*wikipediaいわく、スペクトログラムでは、STFTの結果の絶対値を2乗したもの強さとして使うらしい。

後は、そのデータファイルをgnuplot(ver.4以上)で読み込み、 pm3dを使って底面だけを2次元表示すればOK。

具体的には、

 gnuplot> set pm3d map
 gnuplot> splot "hogehoge.dat"

とする。もちろん、画像ファイルとしても出力できる。

*枠だけ表示され、データが白紙の場合は、適当な間隔で改行を入れればいい。

詳しくはこちらを(http://www-ise2.ist.osaka-u.ac.jp/~shinkai/gnuplot/)。

思った以上にすぐに出来たので、データの分析がかなりしやすくなった。

まあ、wikipediaでスペクトログラムのページを見て、適当にやっただけなので、正確なものかどうかは微妙だが。

もしかしたら、もっと複雑な処理が必要なのかもしれん。(ウェーブレット変換を使うとか?)


2010/05/29(Sat) ヴァイスリッター [長年日記] 編集

_ [gnuplot][Windows][Linux][Ubuntu][Debian][FC][C++][研究関係][雑記]gnuplotのpm3dにおけるカラーバーの範囲を変更する

こんな感じに書くと、カラーの範囲を変更できる。

 gnuplot> set cbrange[0:1.2]
 gnuplot> splot "gplotdata.dat"

2010/05/30(Sun) フェンリルクラッシュ [長年日記] 編集

_ [Linux][Ubuntu][Debian][FC][C++][研究関係][雑記] sshでログインできない場合

まず、「openssh-server」がインストールできているか確認。

出来ていない場合は、

 $ sudo apt-get install openssh-server

でインストールする。

これで大体は出来るが、ファイアーウォールの設定によって弾かれることがある。

Ubuntuは「iptables」ではなく、ufwを使って簡単にポートを設定出来る。

1. 状態を確認。

 $ sudo ufw status

2. ufwを有効化

$ sudo ufw enable

3. 標準で全て拒否するように設定

 $ sudo ufw default DENY

4. sshのポートを開ける

 $ sudo ufw allow ssh

または

 $ sudo ufw allow 22/tcp

とする。で、念のため、目的のポートが開けられたのを確認する。

 $ sudo ufw status

これでいけるはず。

以上!