• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:OpenCvを使ったプログラムでエラーが出ます。)

OpenCvを使ったプログラムでエラーが出る!WindowsXPでは問題なし、Windows7でエラーメッセージが表示される

このQ&Aのポイント
  • OpenCvを使ったプログラムでWindows7の32ビット版で実行するとエラーメッセージが表示されます。エラーメッセージは「Null pointer (null filename)」です。
  • エラーの原因は、cvLoadImage関数がnullのファイル名を受け取っていることです。
  • 対処法としては、ファイル名がnullでないことを確認するか、cvLoadImage関数を呼び出す前にファイルが存在するかどうかをチェックすることです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

エラーメッセージからすると > image = cvLoadImage(fileName); のfileNameが空文字列になっているような感じです。 一つあやしいのは > wcstombs_s(&n, fileName, sizeof(fileName), ofn.lpstrFile, _TRUNCATE); での変換で、 http://msdn.microsoft.com/ja-jp/library/s7wzt4be%28v=VS.80%29.aspx > 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 でロケールを指定するのはどうでしょうか

squrevoid909
質問者

補足

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で、変換結果のマルチバイト文字列用のバッファのアドレスに何も入っていない?つまり正しく変換されていないということでしょうか? ロケールという言葉は初めて聞いたので現在調べ中です^^;

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答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/dd861346.aspx Unicode版のGetOpenFIleNameWで強制的にWCHARになるようにするとか

squrevoid909
質問者

お礼

提示していただいた方法を試しつつタイトルを変えて質問しなおしてみます。 これを機にAPIも少しずつ勉強してみようと思います。 回答ありがとうございました!