OpenCvを使ったプログラムでエラーが出ます。
ダイアログで画像ファイルを選択して表示するプログラムを作ったのですが、WindowsXPでは問題なく実行できるのにWindows7の32ビット版で実行するとダイアログでファイルを選択すると以下のエラーが出ます。
(VisualC++2008の設定はどちらも同じです。OpenCvのバージョンは1.1preです。7、XP共に同じように導入しました)
↓エラーメッセージ
Null pointer (null filename)
in function cvLoadImage,.\loadsave.cpp(404)
Press"Abort"to terminate application.
Press"Retry"to debug(if the app is running under debugger).
Press"Ignore"to continue(this is not safe).
↓問題のあるコード
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main( int argc, char **argv ) {
int key;
OPENFILENAME ofn; // ファイル名情報
WCHAR fileName_w[200]; // ファイル名格納用バッファ
IplImage *image; // 画像の格納先
char windowName[] = "Result";//読み込んだ画像をを表示するウィンドウの名前
// ウィンドウを用意します。後で用意するときは、※1のようにhwndOwnerにNULLを指定します。
cvNamedWindow(windowName);
// OPENFILENAME構造体を設定します。
ZeroMemory(&ofn, sizeof(ofn)); // 初期化
ofn.lStructSize = sizeof(ofn); // 構造体のサイズ
ofn.hwndOwner = (HWND)cvGetWindowHandle(windowName); // 親ウィンドウ
// = (HWND)NULL; // 親ウィンドウがないときはNULLを指定します。※1
ofn.lpstrFile = fileName_w; // ファイル名格納先
ofn.lpstrFile[0] = '\0'; // ファイル名の初期値はなし
ofn.nMaxFile = sizeof(fileName_w); // ファイル名の格納サイズ
ofn.lpstrFilter = L"すべて\0*.*\0Bitmap\0*.bmp\0Jpeg\0*.jpg\0"; // フィルタの設定
ofn.nFilterIndex = 1; // フィルタの初期値
ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; // フラグの設定
// 「ファイルを開く」ダイアログを呼び出します。
if(GetOpenFileName(&ofn) == TRUE){
char fileName[200];
size_t n;
// ファイル名をWCHAR文字列からchar文字列へ変換します。
wcstombs_s(&n, fileName, sizeof(fileName), ofn.lpstrFile, _TRUNCATE);
// 画像ファイルを読み込みます。
image = cvLoadImage(fileName);
// ウィンドウに貼り付けます。
cvShowImage(windowName, image);
}
key = cvWaitKey( 0 );
cvReleaseImage( &image );
cvDestroyWindow( windowName );
return 0;
}
このプログラムはhttp://cvwww.ee.ous.ac.jp/opencv.htmlにあるサンプルを参考にしました。
どうすればエラーをなくすことができるのでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
エラーメッセージからすると
> image = cvLoadImage(fileName);
のfileNameが空文字列になっているような感じです。
一つあやしいのは
> wcstombs_s(&n, fileName, sizeof(fileName), ofn.lpstrFile, _TRUNCATE);
での変換で、
http://msdn.microsoft.com/ja-jp/library/s7wzt4be …
> wcstombs_s は、マルチバイト文字に変換できないワイド文字を検出すると、0 を *pReturnValue に設定し、変換先バッファに空の文字列を設定します。さらに、errno を EILSEQ に設定し、EILSEQ を返します。
ということなので、まずは
error_t eno = wcstombs_s(&n, fileName, sizeof(fileName), ofn.lpstrFile, _TRUNCATE);
if ( ( n == 0 ) || ( eno != 0 ) ) {
エラー処理: printfやMessageBox等を使って fileName等の内容を表示
} ;
とでもして、正しく変換できているか確認してはどうでしょうか。
あとは、ロケール指定版の wcstombs_s_l でロケールを指定するのはどうでしょうか
この回答への補足
error_tでなくerrno_tですよね?何かエラーが出たので・・・
errno_t eno = wcstombs_s(&n, fileName, sizeof(fileName), ofn.lpstrFile, _TRUNCATE);
if ( ( n == 0 ) || ( eno != 0 ) ) {
printf("n:%d\n",n);
printf("fileName:%s\n",fileName);
} ;
とりあえず↑を加えてnとfileNameの内容を表示させたところ、
nは0が表示され、fileNameは何も表示されませんでした。
これは変換された文字数が0で、変換結果のマルチバイト文字列用のバッファのアドレスに何も入っていない?つまり正しく変換されていないということでしょうか?
ロケールという言葉は初めて聞いたので現在調べ中です^^;
No.2
- 回答日時:
>error_tでなくerrno_tですよね?何かエラーが出たので・・・
すみません、書き間違いでした。
>とりあえず↑を加えてnとfileNameの内容を表示させたところ、
>nは0が表示され、fileNameは何も表示されませんでした。
>これは変換された文字数が0で、変換結果のマルチバイト文字列用のバッファのアドレスに何も入っていない?つまり正しく変換されていないということでしょうか?
マニュアルに従えば、その通りということになります。
正しくファイル名が入ってないか、WCHARで入っていないか、ちょっとわかりません。
こうなってくると、OpenCVというよりは、WinAPIとWindows7かVS2008の問題かと思います。
タイトル変えてGetOpenFileNameとwcstombs_sにしぼって再質問したほうが答えがくるかもしれません。
あとは、
Win7でつかえる別のダイアログを使うとか
http://msdn.microsoft.com/ja-jp/magazine/dd86134 …
Unicode版のGetOpenFIleNameWで強制的にWCHARになるようにするとか
提示していただいた方法を試しつつタイトルを変えて質問しなおしてみます。
これを機にAPIも少しずつ勉強してみようと思います。
回答ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
緯度、経度の 10進法と 60進法...
-
家電製品の電力周波数を変える機械
-
Mac 乗数の入力方法
-
c++でmatからvectorへの変換の...
-
gmtime()とlocaltime()は
-
画像ファイル変換(Tiff→PDF)
-
vb.netの型変換について
-
C/C++→JAVAに変換するツール
-
3のつく数字と3の倍数のみを表...
-
VB 6 を VS 2012に変換するには?
-
なぜ通信には16進数文字列が使...
-
MATLAB/simulinkでのD/A変換の仕方
-
マンセル⇔XYZ,RGB変換式或いは...
-
文字コードの変換プログラム
-
C言語からC#への変換ツール
-
bmp → jpeg への変換
-
VB6で10進数を32進数に変換する...
-
OpenCvを使ったプログラムでエ...
-
【EXCEL】カナ、ひらがなを英字...
-
DOSコマンドでの文字コード変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
緯度、経度の 10進法と 60進法...
-
家電製品の電力周波数を変える機械
-
Mac 乗数の入力方法
-
分を時間に変換するプログラム
-
C++からCへのソース変換について
-
3のつく数字と3の倍数のみを表...
-
PHPで、日本語からアルファベッ...
-
なぜ通信には16進数文字列が使...
-
【EXCEL】カナ、ひらがなを英字...
-
エクセルVBAの自動変換機能?
-
VB6からVB2010への変換について
-
C/C++→JAVAに変換するツール
-
StrConvの使い方について教えて...
-
c++でmatからvectorへの変換の...
-
VB6で10進数を32進数に変換する...
-
10進数をBCDに変換する方法
-
UTF8→ShiftJISに変換したいです!
-
C#でのpngからbmpへの変換について
-
VB.NETをJavaに変換するツール...
-
マンセル⇔XYZ,RGB変換式或いは...
おすすめ情報