2011年12月29日木曜日

スピンコントロールで浮動小数点の取り扱い

ダイアログでエディットボックスとスピンコントロールを作る際に、
スピンコントロールのSet Buddy IntegerをFalseにしないといけない。

これを忘れると、関連付けたエディットボックスがスピンコントロールのInt型で扱われるため、
浮動小数点にならないの注意。

あとは

     float value;
     m_xcSpin.SetPos32( value*10 );

とか
     float value = m_xcSpin.GetPos32();

とか使えば大丈夫。

2011年12月17日土曜日

輪郭の処理

参考: http://imagingsolution.blog107.fc2.com/blog-entry-202.html

パスからファイル名の取得

MFCのコードを書いておく。

ユニコードなので、wcharからcharヘの変換とかしてる。


CString filename = PathFindFileName(CString string);
を使ってる。

または,分解・結合可能。


// 分解
char drive[8], dir[256], filename[256],ext[8];
_splitpath(str.c_str(), drive, dir, filename, ext);

// 結合
char dirpath[256];
_makepath(dirpath, drive, dir,NULL,NULL);




void CMainFrame::OnOpenFile()
{
CString         filter("JPEG Files (*.jpg;*.jpeg)|*.jpg; *.jpeg|| BMP files (*.bmp)| *.bmp||");
CString         filePath, strBuf;
CString filename;
    POSITION        pos = NULL;
    CFileDialog     selDlg(TRUE, NULL, NULL,  OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR, filter);
   
    int             err = 0, lbErr = 0;
   
vector<char*> filenames;


    // ファイル名リスト用メモリ確保
    if (!err)
    {
        try
        {
            selDlg.GetOFN().lpstrFile = strBuf.GetBuffer(MAX_PATH *100);
            selDlg.GetOFN().nMaxFile = MAX_PATH *100;
        }
        catch (...) {err = 1;}
    }
    if (!err) if (selDlg.DoModal() != IDOK) err = 1;
    if (!err) if ((pos = selDlg.GetStartPosition()) == NULL) err = 1;
    if (!err)
    {
        while (pos)
        {
            filePath = selDlg.GetNextPathName(pos);

            if (!err)
            {

_bstr_t bSrc(filePath);
char tmp_filepath[256];
//strcpy(m_pathname, sizeof(m_pathname), pathname);
//int len = WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, NULL, 0,NULL,NULL);
WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, tmp_filepath, sizeof(tmp_filepath), NULL, NULL);
string str = tmp_filepath;
m_fullpathes.push_back(str);

// ファイル名のみ抽出する
CString Filename = PathFindFileName(filePath);

_bstr_t bSrc_filename(Filename);
char tmp_filename[256];
////strcpy(m_pathname, sizeof(m_pathname), pathname);
////int len = WideCharToMultiByte(CP_UTF8, 0, bSrc, -1, NULL, 0,NULL,NULL);
WideCharToMultiByte(CP_UTF8, 0, bSrc_filename, -1, tmp_filename, sizeof(tmp_filename), NULL, NULL);
string str_filename = tmp_filename;
m_filenames.push_back(str_filename);

            }
            if (err) break;
        }
        UpdateData(FALSE);
    }
   

UpdateData(false);
}

2011年8月15日月曜日

smart phone applications

<入力>
・フリッカー入力: OpenWnnフリック対応
今のところ、使ってるもの。変換もいいし。
・キー入力: Smart Keyboard + Japanese for Smart Keyboard,English for Smart Keyboard
Trial版を使ってる。 悪くはなさそう。
△変換が単語で切れないのと、左右ボタンがない。
△デフォルトのメーラーでエンターが文字化けしてる!
・手書き: mazec (J) for Android (β)
これは使える。認識もかなりいいし、変換できるし。 

<スケジュール>
・ジョルテ
 Googleカレンダーと同期してるのがありがたい。それとウィジェットでホームに出せるとこがいい。


<ブラウザ>
・Angel Browser
 タブ管理できる。
 画面メモとかあるし、まだあんまり使ってないけど、使いやすそう。


<メーラー>
 使いやすいのがほしい。


<ドキュメント編集>
・Jota Text Editor
 そこそこ使いやすい。あとは入力が良くなるかどうかな気がする。


<メモ>
・手書き: DrawNote 手書きメモ
手書きはいいと思ったけど、フォルダから開く必要があるのは面倒。
・手書き: 親筆
 そこそこ使いやすいかも。
 △ペーストの長押しが反応が悪い。トンってはっきり押す必要がありそう。
 △すでにあるメモは、開かないとノートブック(フォルダみたいなもの)に移せない、また削除できない。
 △ある程度以上、連続では入力できない。←使うメモリの制限?できないなら、あとどれくらい入力できるかを表示してほしい。
 
<電源管理など>
・Power Widget
 1×3とか、1×4の行の中に7個のトグルスイッチを入れられる。
 今は、wifi、bluetooth、機内モード、音設定、傾き検知、常時ON、ディスプレイ輝度調整、を配置。
・Better Sleep
 触ってなくても、動いてる間はスリープにならないように設定できる。

2011年8月5日金曜日

レンズ墨塗りの除去

NSGのGRINレンズの墨塗りについて。

紙やすりでやすったけど、そんなに綺麗にはいかない。
側面や先端のエッジが傷つく。

セロハンテープで取るとすごく綺麗にとれて傷もつかない。

2011年7月30日土曜日

cvWrite, cvRead

プロジェクトに昔のファイルが入ってるから、使いまわしで分かるように書いておく。

int write_data(char *filename, Mat a_mat)
{     
        // ファイルを開く

CvFileStorage *fs;
        fs = cvOpenFileStorage (filename, 0, CV_STORAGE_WRITE);
if(! fs ){
cout<<"can not open "<<filename<<endl;
return 0;
}

        // Mat -> CvMat
CvMat a = a_mat;
     
        // 書き込む
cvWrite (fs, "a", &a);

        // ファイルを閉じる
cvReleaseFileStorage (&fs);
}


int read_data(char *filename)
{
        CvFileStorage *fs;
CvFileNode *param;
// (2)パラメータファイルの読み込み
fs = cvOpenFileStorage (filename, 0, CV_STORAGE_READ);
if(!fs){
cout <<"can not open "<< filename << endl;
return 0;
}

CvMat *a;

param = cvGetFileNodeByName (fs, NULL, "a"); 
        a = (CvMat *) cvRead (fs, param);
cvReleaseFileStorage (&fs);

        // CvMat → Mat
Mat a_mat;
a_mat = Mat(a);

        // あとでdoubleでメモリにアクセスする場合のために,要素の型変換を行う
        a.convertTo(a, CV_64F);

        return 1;
}

2011年7月28日木曜日

シェルを開いて処理する

system関数というのを使う。

system("wgnuplot -persist setting.plt");
のように。

2011年7月16日土曜日

OpenCV ライブラリの読み込み

これをインクルードしておくと便利っぽい。



// ヘッダーファイル
#include <opencv2/opencv.hpp>

// バージョン取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

// ビルドモード
#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif

// ライブラリのリンク(不要な物はコメントアウト)
#pragma comment(lib, "opencv_core"            CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui"        CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_imgproc"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_gpu"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_video"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_objdetect"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_features2d" CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_flann"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ffmpeg"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_legacy"  CV_VERSION_STR CV_EXT_STR)

using namespace cv;



参考:
http://www.nakaguchi.org/index.php?OpenCV/Tips

2011年7月13日水曜日

画素値へのアクセス




int ch = img.channels(); // =3
//std::cout << "step:" << hsv_img.step << ", size:" << w*ch << std::endl;
int width = hsv_img.cols, height = hsv_img.rows;


hue-value gradation image





(2a) 
for(int y=0; y<height; ++y) {
     for(int x=0; x<width; ++x) {
          int a = hsv_img.step*y+(x*ch);
          hsv_img.data[a+0] = (x*180/width);
          hsv_img.data[a+1] = 255;
          hsv_img.data[a+2] = ((height-y)*255/height);
     }
}

(2b) 
for(int y=0; y<height; ++y) {
     uchar *p = hsv_img.ptr(y);
     for(int x=0; x<width; ++x) {
          p[x*ch+0] = (x*180/width);
          p[x*ch+1] = 255;
          p[x*ch+2] = ((height-y)*255/height);
     }
}


(2c) 
for(int y=0; y<height; ++y) {
     uchar *p = hsv_img.ptr(y);
     for(int x=0; x<width; ++x) {
          p[x*ch+0] = (x*180/width);
          p[x*ch+1] = 255;
          p[x*ch+2] = ((height-y)*255/height);
     }
}

(2d) 
for(int y=0; y<height; ++y) {
     for(int x=0; x<width; ++x) {
          Vec3b &p = hsv_img.at<Vec3b>(y,x);
          p[0] = (x*180/width);
          p[1] = 255;
          p[2] = ((height-y)*255/height);
     }
}


(2e) 
Mat_<Vec3b>& ref_img = (Mat_<Vec3b>&)hsv_img;
for(int y=0; y<height; ++y) {
     for(int x=0; x<width; ++x) {
          ref_img(y, x)[0] = (x*180/width);
          ref_img(y, x)[1] = 255;
          ref_img(y, x)[2] = ((height-y)*255/height);
     }
}


(2f) 
vector<Mat> planes;
split(hsv_img, planes);
MatIterator_<uchar> it_h = planes[0].begin<uchar>();
MatIterator_<uchar> it_s = planes[1].begin<uchar>();
MatIterator_<uchar> it_v = planes[2].begin<uchar>();
for(int c=0; it_h!=planes[0].end<uchar>(); ++it_h, ++it_s, ++it_v, ++c) {
     *it_h = ((c%width)*180/width);
     *it_s = 255;
     *it_v = ((height-c/width)*255/height);
}
merge(planes, hsv_img);



(2g)(when no-gap)
MatIterator_<Vec3b> it = hsv_img.begin<Vec3b>();
for(int c=0; it!=hsv_img.end<Vec3b>(); ++it,++c) {
     int x=c%width;
     int y=c/width;
     (*it)[0] = (x*180/width);
     (*it)[1] = 255;
     (*it)[2] = ((height-y)*255/height);
}



(2a)~(2e)までの速度はそれほど変わらない。



参考:
http://opencv.jp/opencv2-x-samples/access_pixel_value

2011年7月10日日曜日

OpenCV カメラの指定

Point Greyのカメラ(Micron Tracker)のデバドラとライブラリなどをインストールしたら、OpenCVでUSBカメラの読み込みができなくなった。




今までの設定は以下のとおり。




VideoCapture cap;

cap.open(0);







原因を探すために、デバッグでたどってみた。

エラーは

cap_dshow.cppの中の







//NOW LETS DEAL WITH GETTING THE RIGHT SIZE

hr = VD->streamConf->GetFormat(&VD->pAmMediaType);




カメラのフォーマットがとってこれないってとこ。

Point GreyのカメラはFlyCapでフォーマットを初期設定しないといけないから止まったのかな。

参考:http://nonnon-in-a-well.blogspot.com/2011/05/micron-tracker2.html







順に見てみると、デバイス(カメラ)をリストアップして、deviceIDでどのデバイス(カメラ)を読むか決めている。

それで、読もうとしていたのが"Point Grey Camera"だった。







//FIND VIDEO DEVICE AND ADD TO GRAPH//

//gets the device specified by the second argument.

hr = getDevice(&VD->pVideoInputFilter, deviceID, VD->wDeviceName, VD->nDeviceName);








ここのdeviceIDが0だったわけだね。

Point Greyをインストールしたせいで、デバイスのリストアップの順序が変わったらしい。

それで、deviceIDを1にしたら問題なく読み込めた。




VideoCapture cap;

cap.open(1);

2011年7月9日土曜日

OpenCV 動画の保存・読み込み

動画の保存と読み込みについて。

<環境>
Windows 7にWin7Codecsをインストールした状態
保存形式(拡張子): 「*.avi」


圧縮形式とメモリ量、速度について。



-----
Intel IYUV形式のAVI: 保存、読み込み両方OK。メモリは大きい。
-----
Xvid MPEG-4 Codec: 保存可能。それなりに早い。メモリはかなり小さい。読み込みもOK。
Lagarith Lossless Codec: 保存可能。それなりに早い。メモリは普通。読み込みもOK。
x264vfw - H.264/MPEG-4 AVC codec: 保存可能。それなりに早い。メモリは小さい。読み込みもOK。
Cinepack Codec by Radius: 保存、読み込み両方OK。ただし、圧縮に時間がかかる。
-----
Microsoft Video 1:保存OK。メモリは普通。読み込み失敗。
無圧縮:保存はできるけど、読み込みでメモリの開始位置か、チャネルが間違っているように思う。
色が分離しちゃってるから。
-----
Microsoft RLE: 保存ができない。
ffshow: 保存できない。
-----

OpenCV USBカメラ

OpenCV 2.3.1。

USBカメラの読込も初期化時点でstatic変数のせいで、動画が読み込めない(2.2では問題なく動いてる)。

参考:
http://nonnon-in-a-well.blogspot.com/2011/07/opencv.html
http://nonnon-in-a-well.blogspot.com/2011/07/opencv-videowriter.html

USBカメラの場合はDirectShowを使っているみたいで、

CoInitialize(NULL);


VideoCapture cap(filename);
または
cap.open(filename);

の前に追加。


終了時は

CoUninitialize();

を追加。

OpenCV 動画読込

2.2と2.3で動画(AVI?)関連のコードが変わってる。

ノートPC(2.2)で動くのに、デスクトップ(2.3.1)で動かない。
aviファイルを読み込む際に、

char *filename = "*.avi";
VideoCapture cap;
cap.open(filename);

とするわけだけど、ファイルを開けない。
なんでかなぁ、ということでソースをたどってみた。

こちらもどうやら、動画のライブラリの読み込みができていないせいで、

AVIFileInit();


AVIFileExit();


を追加する。
参考:http://nonnon-in-a-well.blogspot.com/2011/07/opencv-videowriter.html

2011年7月7日木曜日

OpenCV VideoWriter

動画の保存のためのクラス。


VideoWriter vw(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
または、
vw.open(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
でファイルを開く。

その後、
vw.write(Mat &frame);
でファイルの書き込み。
終了は自動でしてくれる。



注意:
スレッドで繰り返し動画の保存をしようとしている時のこと。

ビデオの初期化部分でAVI用のライブラリを読み込む。
それがstaticな関数で読み込んでて、一度読み込むとフラグが立つ。
フラグもstatic。
そのため、次にファイルを開くときに、フラグが立っているため、ライブラリを読み込めない。
→ cap_vfw.cpp の static void icvInitCapture_VFW()

そこで、動画保存用にファイルを開く前にライブラリを読み込むことにした。

AVIFileInit();
VideoWriter(filename, CV_FOURCC_PROMPT, fps, size, true);
・・・

そして終了時に

AVIFileExit();

を追加。
これで繰り返し保存ができる。
追加のヘッダとライブラリは、下記ファイル。

#include <vfw.h>
vfw32.lib

2011年7月6日水曜日

Boost thread mutex

mutexのロックについて

boost::mutex m_mtx;

このm_mtxを共有している部分でロックをかける。

{ }で囲った範囲内でロックがかかり、{ }を出るとロックが自動的に解除される


何もない地の部分で{ }を使ってもいい。

{
     boost::mutex_scoped_lock lock(m_mtx);
     ・・・
}
または、解除方法として
lock.unlock();
という方法もある。

2011年7月4日月曜日

VC++ MFC

<AppEx>というクラスを使うには、

stdafx.hの中で
#include <afxcontrolbars.h>     // MFC におけるリボンとコントロール バーのサポート
を入れておく必要がある。


<タブコントロール>
タブの変更時の関数内。

void CLaserEndoscopeDlg::OnTcnSelchangeTabFunctions(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。
int        sel;
sel = m_xcTab.GetCurSel();
    m_tabFunc.ShowWindow(sel == 0 ? SW_SHOW : SW_HIDE);
    m_tabConfig.ShowWindow(sel == 1 ? SW_SHOW : SW_HIDE);

if (pResult) *pResult = 0;
}

関数を生成したときには、最後に
*pResult = 0;
が自動的に記入されているが、
if (pResult)
を前につけないと、初期化の際にエラーになるので注意。
(Vistaではエラーにならなくて、Windows 7でエラーになった。)

2011年7月3日日曜日

Polaris marker

マーカの土台部分。
ねじは、インチねじで、No.4で並目(UNC; Coarse)。下穴は2.2mmくらいで。
ちなみに、UNFっていうのもあって、こっちは細目(Fine)。下穴は2.3mmくらいで。

2011年7月1日金曜日

VC++ アプリケーションの起動エラー

環境はVisual Studio 2008。
それでプログラムがコンパイルは通っても起動しない。
調べてみて、原因ぽいのが
Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)。
入れなおし。
リンク:http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displaylang=ja




参考
http://d.hatena.ne.jp/piy/20081130/1228020473

2011年6月30日木曜日

Win32とx64

Visual Studioで、Win32とx64は共存できないのかな。
今までx64で作ってたけど、キャプチャボードのライブラリがWin32じゃないと動かない。
それでプロジェクトを分けてWin32とx64で作って、リンクさせようとしたけど、ライブラリの関数が見つからんいといわれる。

2011年6月29日水曜日

OnTimer x64

プロジェクトをWin32からx64に変更すると、
OnTimerでエラーが出る。
これは、Win32のUINTからx64でUINT_PTRと型が変わるかららしい。
だから、関数をOnTimer(UINT_PTR nEvent)に直せばいいようです。




参考
http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/1defe0d8-3c6e-4a5c-8ba4-0c052502d2df

2011年6月28日火曜日

file入出力

<入力>
ifstream ifs(char *filename, ios::in);
とか
ifs.open(char *filename, ios::in);
とかでファイルを開く

char buf[64];
ifs>>buf;
これだとスペースとかで区切られる。

行で読むときは
ifs.getline(buf, sizeof(buf));
というようにする。

文字の型変換

・ユニコードとマルチバイト
WideCharToMultiByte
MultiByteToWideChar

・stringとchar

2011年6月25日土曜日

Boost threadの引数

スレッド生成時に引数をとることにしていて、
int型の引数はちゃんと値を入力できたけど、char*型は値が入らない。
どうなってるの?

スレッドとウィンドウ

スレッドの中でウィンドウを宣言して、スレッドを一旦終了してから再度開始する場合。
さらに、ちゃんとスレッドを解放できない時。うまく開放できてないっぽい。
どこかでリークしているウィンドウの宣言(名前)とぶつかって、ウィンドウを作れない。

使っているのは、boost threadとOpenCV2.2.9。
ちゃんと解放しましょう、ということなんだけど、分からず、スレッドの終了時にcvDestroyAllWindows()で一括削除。

2011年6月24日金曜日

MFC

ラジオボタン
:複数の選択肢から1つを選択する

<使い方>
・グループボックスの中に複数のラジオボタンを配置
・ラジオボタンのIDは連続した番号でなければならない
例:IDC_RADIO_CANDIDATE01, IDC_RADIO_CANDIDATE02, IDC_RADIO_CANDIDATE03, …。のように
・先頭のラジオボタンのプロパティでGroupをTrueに設定する
(その他のラジオボタンでGroupをTrueにしたら,選択肢が1つだけにはならなかった)
・先頭の(?)ラジオボタンに変数を加える(他のボタンで加えてもいいのかな?面倒なので試してない)
valueでint型にしておいた。
・先頭の(?)ラジオボタンでイベントの追加
クリックされたら,というところで,
UpdateData(true);
  ・・・
UpdateData(true);


以上で,動きました。

2011年6月18日土曜日

構造体のvector配列におけるsort

評価関数を別に作るらしい
struct Point2D {
     int x;
     int y;
}

vector<Point2D> pt;

bool ascending_x_Point2D (const Point2D &_p1, const Point2D &_p2)
{
     return _p1.x < _p2.x;
}


bool ascending_y_Point2D (const Point2D &_p1, const Point2D &_p2)
{
     return _p1.y < _p2.y;
}


sort(pt.begin(), pt.end(), ascending_xPoint2D);


※ソートの範囲をしているするには
sort(&pt[0], &pt[5], ascending_xPoint2D);
のように、ソートの始めと終わりのアドレスを渡す。




-----
参照:http://atashi.net/inu/ja/notes/stl_vector_sort.html

2011年6月7日火曜日

OS on SSD スタートアップ修復

PCつけっぱなしにしてたら、朝ブルースクリーンになってて、スタートアップがおかしくなったとでてきた。
OSはSSDに入ってる。
それがSSDは認識されてるはずだけど、BIOSから見えてないようで、さきにドライバを入れてみるが?
Windows 7 DVD→ドライバのインストール→スタートアップ修復とかやっても、ダメ。

結局、OSの再インストール。
でも、今までのデータは残されていたから、環境の構築だけで済む。
Program Filesの中は、バックアップされて、他のはそのまま残ってるみたい。

2011年6月3日金曜日

VC++ .libのリンク

1つのソリューションにdllのプロジェクトを作ったときのリンクについて。
#pragma comment ("*.lib",lib)
と書くけど、リンクされなかった。
どうやらプロジェクトの依存関係をきちんと指定しないといけないみたい。
依存関係にチェックしておいたら、コメントでリンクする必要もないらしい。

2011年5月11日水曜日

PCA in OpenCV

使い方

using namespace cv;

PCA pca(const Mat& data, const Mat& mean, int flags, int maxComponents=0)
となってる。

入力はその通りで、
data:多次元のデータ。
flag:普段の計算はサンプルを列にしているので、CV_PCA_DATA_AS_COLSを指定
   (サンプルを行に格納するときは、CV_PCA_DATA_AS_ROWS)。
mean:データから計算してほしいから、Mat()を入力。
maxComponents:必要な次元数を指定する。0は、データの次元数のままで計算される。




入力すれば計算してくれて、結果は以下の変数で取得できる。


pca.eigenvectors:固有ベクトル
pca.eigenvalues:固有値
pca.mean:平均値


他にコピーしたければ、
pca.eigenvectors.copyTo(Mat &mat)
Mat eigenvalues = pca.eigenvalues.clone()
とか使って。


中身は、
pca.mean.at<double>(0,0)などで見られる。

Micron Tracker2

3つ目の光学式三次元位置計測装置。

デバイスマネージャで認識されている状態で。

PCを起動させてそのままプログラムを動かそうとすると、通信できない。
分かったことは、初期状態で、データ形式と転送速度が指定されてないため。
そこで、Point GreyのサンプルプログラムFlyCap.exeで形式と速度を指定すると、使えるようになる。

2011年5月4日水曜日

Boost1.46.1のコンパイル

bjamを使って、Boost 1.44の64bit用のコンパイルはできたけど、Windows XP 32bitでBoost1.46.1のコンパイルができない。
使ったbjamは、ダウンロードのページにリンクがあるboost-jam-3.1.18-1-ntx86.zip
"UPDATE_NOW …"とかwarningがでてくるけど、よく分からず。
windows用のインストーラでインストールしようとしたけど、ライブラリができなくて、??

もうちょっと調べてみたら、
boost_1_46_1/bootstrap.bat
で作成したbjamじゃないといけないんだとか(.batファイルをダブルクリックすればできた)。
参考: http://cosmo0920.wordpress.com/2010/12/06/boost-1-45-0-%E3%82%92bjam%E3%83%93%E3%83%AB%E3%83%89/

それで、コンパイルはできたけど、link=static runtime-link=sharedでは、.libファイルしか生成されなかった。
link=sharedにしたら、.libと.dllがboost_1_46_1/stage(デフォルトの出力フォルダ)に生成された。

>bjam --toolset=msvc-9.0 link=shared --without-regex --without-python --without-mpi


参考
http://blog.goo.ne.jp/anoydevl/e/cd1c8447740f996dd9d8d7e753cb02eb