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.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も少しずつ勉強してみようと思います。
回答ありがとうございました!
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で、変換結果のマルチバイト文字列用のバッファのアドレスに何も入っていない?つまり正しく変換されていないということでしょうか?
ロケールという言葉は初めて聞いたので現在調べ中です^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
緯度、経度の 10進法と 60進法...
-
VB6からVB2010への変換について
-
【EXCEL】カナ、ひらがなを英字...
-
Mac 乗数の入力方法
-
シフトJISのCSVファイルをUFT-8...
-
ハフ変換の原理をわかりやすく...
-
bitmapクラスをiconクラスに変...
-
数値英単語変換プログラム
-
Excel-VBAのmsgBox()の不思議
-
3のつく数字と3の倍数のみを表...
-
自作ソフトキーボードによる文...
-
分を時間に変換するプログラム
-
VB 6 を VS 2012に変換するには?
-
bmp→jpgに、jpg→bmpに
-
vb.netの型変換について
-
LPCWSTRへの型変換について
-
VC++2005で、CString型に16進...
-
MATLAB/simulinkでのD/A変換の仕方
-
C/C++→JAVAに変換するツール
-
SJIS⇔UTF-8の文字コード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
緯度、経度の 10進法と 60進法...
-
Excel-VBAのmsgBox()の不思議
-
Mac 乗数の入力方法
-
家電製品の電力周波数を変える機械
-
3のつく数字と3の倍数のみを表...
-
bmp→jpgに、jpg→bmpに
-
10進数をBCDに変換する方法
-
【EXCEL】カナ、ひらがなを英字...
-
StrConvの使い方について教えて...
-
分を時間に変換するプログラム
-
画像ファイル変換(Tiff→PDF)
-
マンセル⇔XYZ,RGB変換式或いは...
-
C/C++→JAVAに変換するツール
-
VB6からVB2010への変換について
-
c++でmatからvectorへの変換の...
-
DOSコマンドでの文字コード変換...
-
VB.NETをJavaに変換するツール...
-
SJIS⇔UTF-8の文字コード...
-
なぜ通信には16進数文字列が使...
-
C#でのpngからbmpへの変換について
おすすめ情報