ダイアログでエディットボックスとスピンコントロールを作る際に、
スピンコントロールのSet Buddy IntegerをFalseにしないといけない。
これを忘れると、関連付けたエディットボックスがスピンコントロールのInt型で扱われるため、
浮動小数点にならないの注意。
あとは
float value;
m_xcSpin.SetPos32( value*10 );
とか
float value = m_xcSpin.GetPos32();
とか使えば大丈夫。
2011年12月29日木曜日
2011年12月17日土曜日
パスからファイル名の取得
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);
}
ユニコードなので、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
触ってなくても、動いてる間はスリープにならないように設定できる。
・フリッカー入力: 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 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日木曜日
2011年7月16日土曜日
OpenCV ライブラリの読み込み
これをインクルードしておくと便利っぽい。
↓
参考:
http://www.nakaguchi.org/index.php?OpenCV/Tips
↓
|
参考:
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);
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);
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);
}
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)
(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);
}
}
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)
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)
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
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);
今までの設定は以下のとおり。
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。
Microsoft Video 1:保存OK。メモリは普通。読み込み失敗。
無圧縮:保存はできるけど、読み込みでメモリの開始位置か、チャネルが間違っているように思う。
色が分離しちゃってるから。
-----
Microsoft RLE: 保存ができない。
<環境>
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);
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を使っているみたいで、
を
VideoCapture cap(filename);
または
cap.open(filename);
の前に追加。
終了時は
CoUninitialize();
を追加。
CoUninitialize();
を追加。
OpenCV 動画読込
2.2と2.3で動画(AVI?)関連のコードが変わってる。
ノートPC(2.2)で動くのに、デスクトップ(2.3.1)で動かない。
aviファイルを読み込む際に、
char *filename = "*.avi";
VideoCapture cap;
cap.open(filename);
とするわけだけど、ファイルを開けない。
なんでかなぁ、ということでソースをたどってみた。
こちらもどうやら、動画のライブラリの読み込みができていないせいで、
AVIFileInit();
を追加する。
参考:http://nonnon-in-a-well.blogspot.com/2011/07/opencv-videowriter.html
ノート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();
を追加。
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();
という方法もある。
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でエラーになった。)
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くらいで。
ねじは、インチねじで、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
それでプログラムがコンパイルは通っても起動しない。
調べてみて、原因ぽいのが
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で作って、リンクさせようとしたけど、ライブラリの関数が見つからんいといわれる。
今まで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
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日火曜日
2011年6月25日土曜日
スレッドとウィンドウ
スレッドの中でウィンドウを宣言して、スレッドを一旦終了してから再度開始する場合。
さらに、ちゃんとスレッドを解放できない時。うまく開放できてないっぽい。
どこかでリークしているウィンドウの宣言(名前)とぶつかって、ウィンドウを作れない。
使っているのは、boost threadとOpenCV2.2.9。
ちゃんと解放しましょう、ということなんだけど、分からず、スレッドの終了時にcvDestroyAllWindows()で一括削除。
さらに、ちゃんとスレッドを解放できない時。うまく開放できてないっぽい。
どこかでリークしているウィンドウの宣言(名前)とぶつかって、ウィンドウを作れない。
使っているのは、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);
以上で,動きました。
:複数の選択肢から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;
}
-----
参照:http://atashi.net/inu/ja/notes/stl_vector_sort.html
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の中は、バックアップされて、他のはそのまま残ってるみたい。
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)などで見られる。
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で形式と速度を指定すると、使えるようになる。
デバイスマネージャで認識されている状態で。
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
使った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
登録:
投稿 (Atom)