<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


サーモグラフィーのカラーマップをC#で生成する方法

半年以上も更新してないのに、急に記事を書くこのとってつけた感はいったい。

さておき、こういう仕事をしてると、赤外線カメラからUSB経由でとったシグナルデータをサーモグラフィー画像として表示するアプリを作る機会も多いですよね。そういうのはWindowsでやるのが多いので、まあ言語はC#になります(断言)。

そんなとき、画像の横にさらっと、
カラーマップ
こういう画像が置いてあると、説得力が増しますよね。

でも、色の対応とかは設定で変化したりするので、あらかじめ画像を用意しておくわけにいかないので、動的に作る必要がありますよね。たいていそうです。

なので計算で作ります。


» Read More...
スポンサーサイト

究極の?C#プログラミング

[完全版]究極のC#プログラミングという記事が連載されている。出版された本の内容をそのまんま載せてるそうで、そりゃあどうも太っ腹。

今は第一章だけがアップされている状態で、読んでみたんだけど、うーん。

1.2 C# 3.0らしいソースコードとは?
さて、そろそろ論よりソースである。能書きを重ねるよりも、実際のソースコードを見るほうがわかりやすいだろう。
Chapter1 C# 3.0らしいプログラミングとは? - @IT
というところでもう躓いた。なんか、いろいろ美辞麗句を重ねた結果、引数にdelegate(匿名メソッド)を渡すんだって、うーん、確かに理解できるんだけど、うーん、もやもや。
「究極ってその程度!?」みたいな。そこ、そんなに文字数をたくさん使うとこか?みたいな。

文章がいちいち持って回ってる感じもあまりスキになれない。
大ざっぱにいえば、クラスベースとはクラスをもとにオブジェクトを作成するもので、プロトタイプベースとはプロトタイプをもとにオブジェクトを作成するものである。
Chapter1 C# 3.0らしいプログラミングとは? - @IT
大ざっぱに言えてねえ(笑)

あと、これホントかな?
しかし、C# 3.0はクラスに対する依存性を大幅に引き下げている、クラスベースでありながら、プロトタイプベースのような書き方ができてしまうこともある。
Chapter1 C# 3.0らしいプログラミングとは? - @IT
プロトタイプみたいなこと、できたっけ?どういうコードのことを言ってるんだろう?とりあえず一章のその後のページではこの記述に関するお話は出てこなかった。あ、もしかして匿名クラスのことかな?まさか、まさか。あれはプロトタイプなんかじゃ全然ないし。拡張メソッドも、別にプロトタイプとは関係ないよねえ…ていうか拡張メソッドはメリットが大したこと無い割に毒性が強いからあんまり使いたくない。

C#3.0は、とてもステキな言語だと思う。Javaがずーっと進歩しない間、1.0→2.0→3.0とドラスティックに変化して、他の言語のイイところをパクって来ているから言語仕様としては現在最強(僕の中では)。LINQとかそこまでやるかよってぐらいの機能だし。最近デスクトップアプリのお仕事がいくつかあるのでジャンジャン使ってる。(WebはPHPでやってる←PHPとか使うプログラマーは以下略)

それはさておき、「究極のC#プログラミング」第一章はあんまりピンと来なかったけど、残りの章がどうなるか、楽しみ楽しみ。


.NETでパラパラマンガ

最近、サーモグラフィカメラを使ったプログラムをC#3.0で作っている(ラムダとか使っちゃってちょっと賢くなった気分)。

それで、カメラのAPIは1フレーム分の静止画像、というか、各ピクセルの赤外線シグナル値を返すようになっていて、静止画像を受け取るたびにBitmapオブジェクトに書き込んでGraphics.DrawImage()ってやってパラパラマンガみたいにしてカメラのリアルタイム映像を表示する必要があった。

そんでさくっとこんな

for (int y = 0; y < bmp.Height; x++) {
for (int x = 0; x < bmp.Width; x++) {
int idx = y * bmp.Height + x;
bmp.SetPixcel(x, y, SignalToColor(signal[idx]));
}
}
graphics.DrawImage(bmp);
感じで書いてみたところ、遅い遅い。秒間9フレームで画像を受け取ってるはずなのにカクカク動く。おっかしいなあ。

カメラのAPIを疑いつつも、もしやと思って調べてみたら、BitmapのSetPixel、GetPixelはすごく遅いらしい。そうだったのか!
LockBits() によって内部メモリをロックする。
 :
(略)
 :
これは、図を見ると前回の GetPixel() SetPixel() より100倍以上速い。
MemoNyanDum : Bitmap の内部色データにアクセスする (1)
ふぅん、と思って、上記の記事をまねて、unsafeでポインタなプログラム(わーい久しぶりにポインタだっ)でBitmapDataの内部配列に値を入れていくやり方に変えてみた。
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
unsafe {
byte* p = (byte*)data.Scan0;
for (int i = 0; i < signal.Length; i++) {
Color c = SignalToColor(signal[i]);
p[0] = c.R;
p[1] = c.G;
p[2] = c.B;
p += 3;
}
}
bmp.UnlockBits(data);
graphics.DrawImage(bmp);
そしたら、ものすごい速くなってチャキチャキ動画再生されるようになった。すごい。

ていうか、BitmapのSetPixelがそんなに遅い理由がわからない。配列に値をセットするだけじゃないのか。


ローカルディレクトリを監視してリモートディレクトリを同期させるツール

Windows上でローカルディレクトリを監視して、変更があったら別のディレクトリに同じように反映させるコマンドラインツールを作ったよ。

つまり、起動させておくと、

監視ディレクトリ以下で
ファイル作成→反映先にコピー
ファイル名変更→反映先も変更
ファイル削除→反映先も削除
ディレクトリごと削除→反映先も削除
みたいなことができる。

MonitorCopy 同期元 同期先 [/ID:正規表現] [/IF:正規表現]
[/XD:正規表現] [/XF:正規表現]
[/V] [/Q]

同期元 監視するフォルダを指定します。NTFSファイルシステムを指定します。
同期先 反映先フォルダを指定します。
/ID:正規表現 同期元からの相対パスが正規表現にマッチするディレクトリを対象とします。
/IF:正規表現 同期元からの相対パスが正規表現にマッチするファイルのみ同期を行います。
/XD:正規表現 同期元からの相対パスが正規表現にマッチするディレクトリを除外します。
/XF:正規表現 同期元からの相対パスが正規表現にマッチするファイルは除外します。
/V 冗長な出力を行います。
/Q 同期対象のファイル名を出力しません

こんなものなにに使うかというと、VMWare上の開発環境にsamba立ち上げといて、Windows上で開発したソースコードをどんどん送り込むみたいなことに、僕は使ってる。え、samba上で直接触ればいいじゃんとか、それだとVMWare落としてるときにeclipseがフリーズしたみたいになるんだもの…
ZIP形式ダウンロード



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。