2010年5月29日土曜日

VC++:Stringの取り扱い

最近OpenCVなどを使うこともあり、VC++を使い始めました。が、文字列の取り扱いには苦労しますね(^^; Rubyなんかだと簡単にできることがいちいちキャストしたりなんかしないといけなくて、そのたびにググる必要があり、時間がかかります。

例えば、VC++からDOSコマンドを呼び出すために

system("ruby abc.rb arg1 arg2")

などとしたいのですが、そのときにこの引数を

String^ arg1 = "1"
String^ arg2 = "2"
command = "ruby abc.rb "+arg1+" "+arg2
system(command)

などとすると String^はchar *に変換出来ませんというようなエラーになってしまいます。systemへの引数はchar *だけど、commandはString^だからエラーだそうです。command.to_charのようなメソッドはないんでしょうかねえ。結局ここにあるような方法を利用して String^をchar *に変換するはめになるのですが、なんとかなりませんかね、これ(^^;

2010年5月28日金曜日

OpenCV:メモリにある画像データの取り扱い

OpenCVの例では主にファイルにある画像を取り扱うように出来ています。すでにメモリに画像が入っている時にはどうしたらいいのか考えました。メモリ上に512*512のバイト列(1画素8ビットのグレイレベルデータ)があるとします。OpenCV2.1では画像をMat(行列)型で扱えるので、下記のようにしました。

Mat *image1 = new Mat(512,512,CV_8UC1); //画像用Matインスタンスの作成 8bit
memcpy(image1->data, imagedata, 512*512); //画像データをimage1->dataに読み込む
           //imagedataは512*512バイトの画像列の先頭アドレス

Mat *image2 = new Mat(512,512,CV_8UC1); //画像用Matインスタンスの作成 8bit
memcpy(image2->data, imagedata2, 512*512); //画像データをimage1->dataに読み込む

Mat *difImg = new Mat(512,512,CV_8UC1);
absdiff((Mat &)*image2, (Mat &)*image1, (Mat &)*difImg); //差画像の作成

//以下、表示
namedWindow("img1", CV_WINDOW_AUTOSIZE);
cvMoveWindow("img1", 50, 50);
imshow("img1", (Mat &)*image1);
namedWindow("img2", CV_WINDOW_AUTOSIZE);
cvMoveWindow("img2", 580, 50);
imshow("img2", (Mat &)*image2);
namedWindow("dif", CV_WINDOW_AUTOSIZE);
cvMoveWindow("dif", 50, 600);
imshow("dif", (Mat &)*difImg);
namedWindow("dif*10", CV_WINDOW_AUTOSIZE);
cvMoveWindow("dif*10", 580, 600);
imshow("dif*10", (Mat &)*difImg2);
waitKey(0);
cvDestroyWindow ("img1");
cvDestroyWindow ("img2");
cvDestroyWindow ("dif");
cvDestroyWindow ("dif*10");

2010年5月27日木曜日

OpenCV:imshow:Windowの位置指定

OpenCVを始めました。imshowで画像をWindow表示することは出来たんですが、適当な位置にWindowが出て困ります。OpenCV2.1はC++のクラス対応ということで探したのですが、位置決めの関数はCのみの対応のようでした。

cvMoveWindowという関数で、

cvMoveWindow(Window名、x、y)

と指定するようです。x、yはディスプレイ左上を原点とするピクセル値です。

全部クラスでまとめてくれんかなあ。

2010年5月20日木曜日

ゆうメール

ちょっとした冊子を知り合いに贈る用があったのでゆうメールを利用しました。ゆうメールは昔 書籍小包といっていたもので、信書はだめですが書籍や論文などを送るのにゆうパックよりも安く送ることが出来ます。

重量~150g~250g~500g~1kg~2kg~3kg
運賃180円210円290円340円450円590円

さらに郵便局の人がレターパックというのもあると教えてくださって、場合によってはこちらの方が安くなるようです。僕のは1kg以下でしたのでゆうメールで340円でした。レターパックはレターパック500(500円)とレターパック350(350円)があって、封筒の厚みの差と、手渡し方の差があるようです。1kgを超える場合にはお得になりそうですね。

2010年5月16日日曜日

Scilab:乱数によるΠの計算

Scilabで乱数を使ってΠを求めてみました。

Scilabでは立ち上がったWindowサイズに応じてページサイズの出力が出る度にページコントロールで

[Continue display? n (no) to stop, any other key to continue]

のようなプロンプトを出して来ますが、面倒なのでこれを

lines(0)

で切ります。プログラムは下記のようにしました。(プログラムはScilabのメニューのApplications→Editorでエディターを開いて打ち込み、EditorのメニューのExecute→Load Into Scilabで実行します。)

lines(0)
maxc=100000000
count = 0;
for i = 1:maxc
  x=rand(1);
  y=rand(1);
  if sqrt(x^2+y^2) <= 1.0 then
    count = count + 1;
  end
  if modulo(i,1000000) == 0 then
    i
    pai=4*count/i
  end
end
count
pai=4*count/maxc

この乱数の精度がよくわかりませんが、実行結果です。

回数Πの近似値
10,000,0003.1413716
20,000,0003.142014
30,000,0003.1417497
40,000,0003.1418244
50,000,0003.141764
60,000,0003.1417499
70,000,0003.1417391
80,000,0003.1416907
90,000,0003.1416595
100,000,0003.1416488

1億回計算させても小数点以下4桁目からずれています(^^; Core2Duo 1GHz メモリ2GBのノートPCで3時間くらいかかりました(^^;

2010年5月14日金曜日

PDF slim:PDFのサイズ縮小ソフト

窓の杜に

マグノリア、手軽にPDFファイルのサイズを圧縮できる「PDF Slim」を無償公開

という記事が出たので早速dlして使ってみました。これでメールに添付するPDFファイルのサイズ調整が簡単に出来そうです。記事に書いてあるようにPDFファイルをドロップダウンするだけでPDFを圧縮することが出来ます。4段階の圧縮が可能で、実行してみると

■画像の多いPPTファイルから作ったPDFファイル(数字は%を表します)
カラーモノクロ
最高画質9881
高画質7573
普通4949
低画質2935

モノクロ変換は画像は大体(バグなのか少しカラーが残ることもありました)モノクロになるのですが、フォントの色や図形の色はそのままでした(^^;

■文字中心の報告書(グラフや簡単な図も含みます)
カラーモノクロ
最高画質9594
高画質9594
普通9291
低画質9090

ということで画像が多いファイルはかなり圧縮できるようです。

Ruby:Excel:Excelのヴァージョンの違い その2

昨日うまくいったと思ったのですが、
Excel2000のSR-1だと動かず(表示されない)、SP-3だとちゃんと動く(^^;
ということが分かりました。どう解決すればいいのやら・・・