画像処理プログラムの実行結果画像が表示されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nanashi
記事: 2
登録日時: 5年前

画像処理プログラムの実行結果画像が表示されない

#1

投稿記事 by nanashi » 5年前

初めまして。
opencvを用いてSURFの処理を行うプログラムを作成したのですが、行き詰まってしまいました。
初歩的な問題なのかもしれませんが、あらゆる可能性を試したつもりです。(パスの指定や、ソースの変更、修正等。ビルドは正常に終了できました。作業ディレクトリはデフォルト通りで、ライブラリ・インクルードファイル・コマンド引数の設定も問題なく行えています。また画像ファイルもソースファイルと同じディレクトリに置いてあります。)
以下の点で困っています。

VC++ 2010 の利用に於いて、SURF処理を施された"Alldrinkbottle.bmp"が表示されず、黒いウィンドウのままになる。
ウィンドウ自体は、フリーズすることもなく動かせますし、終了もできます。ただ、"Alldrinkbottle.bmp"がどうしても表示されません。
コードは下記の通りです。

コード:

#include <iostream>
#include <string> 
#include <C:\opencv\opencv\include\opencv\cv.h>
#include <C:\opencv\opencv\build\include\opencv\highgui.h>
 
using namespace std;
using namespace cv;
 
 
int main(int argc, char *argv[])
{
  // (1)load Color Image
  const char *imagename = argc > 1 ? argv[1] : "Alldrinkbottle.bmp";
  Mat colorImage = imread(imagename,1);
  if(colorImage.empty())
    return -1;

  // (2)convert Color Image to Grayscale for Feature Extraction
  Mat grayImage;
  cvtColor(colorImage, grayImage, CV_BGR2GRAY);
 
  // (3)initialize SURF class
  SURF calc_surf = SURF(500,4,2,true);
 
  // (4)extract SURF
  vector<KeyPoint> kp_vec;
  vector<float> desc_vec;     
  calc_surf(grayImage, Mat(), kp_vec, desc_vec);
 
  // (5)draw keypoints
  cout << "Image Keypoints: " << kp_vec.size() << endl;
#if 1
  vector<KeyPoint>::iterator it = kp_vec.begin(), it_end = kp_vec.end();
  for(; it!=it_end; ++it) {
    circle(colorImage, Point(it->pt.x, it->pt.y), 
       saturate_cast<int>(it->size*0.25), Scalar(255,255,0));
  }
#else
  for(int i = 0; i < kp_vec.size(); i++) {
    KeyPoint* point = &(kp_vec[i]);
    Point center;  // Key Point's Center
    int radius;      // Radius of Key Point
    center.x = cvRound(point->pt.x);
    center.y = cvRound(point->pt.y);
    radius = cvRound(point->size*0.25);
    circle(colorImage, center, radius, Scalar(255,255,0), 1, 8, 0);
  }
#endif
 
  namedWindow("SURF",CV_WINDOW_AUTOSIZE);
  imshow("SURF", colorImage);
  waitKey(0);
 
  return 0;
}
またデバック時の結果は以下のようになりました。
'nakazawa_lab.exe': 'C:\Users\Owner\Documents\Visual Studio 2010\Projects\nakazawa_lab\Debug\nakazawa_lab.exe' を読み込みました。シンボルが読み込まれました。
'nakazawa_lab.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\kernel32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\KernelBase.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\opencv\opencv\build\x86\vc10\bin\opencv_core243.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msvcp100.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msvcr100.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\opencv\opencv\build\x86\vc10\bin\opencv_features2d243.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\opencv\opencv\build\x86\vc10\bin\opencv_imgproc243.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\opencv\opencv\build\x86\vc10\bin\opencv_flann243.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\opencv\opencv\build\x86\vc10\bin\opencv_highgui243.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\user32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\gdi32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\lpk.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\usp10.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msvcrt.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\ole32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\rpcrt4.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\oleaut32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\advapi32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\sechost.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18201_none_ec80f00e8593ece5\comctl32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\avifil32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\winmm.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msacm32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msvfw32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\shell32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\shlwapi.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\avicap32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\version.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\opencv\opencv\build\x86\vc10\bin\opencv_nonfree243.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msvcp100d.dll' を読み込みました。シンボルが読み込まれました。
'nakazawa_lab.exe': 'C:\Windows\System32\msvcr100d.dll' を読み込みました。シンボルが読み込まれました。
'nakazawa_lab.exe': 'C:\Windows\System32\imm32.dll' を読み込みました。Cannot find or open the PDB file
'nakazawa_lab.exe': 'C:\Windows\System32\msctf.dll' を読み込みました。Cannot find or open the PDB file
プログラム '[8560] nakazawa_lab.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。

もしよろしければご教授願えないでしょうか。
宜しくお願い致します。

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#2

投稿記事 by sleep » 5年前

nanashi さんが書きました: 'nakazawa_lab.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました。Cannot find or open the PDB file
「PDBファイルが見つからないか、または開くことができない」
と言われているようです。
一度、ビルド(プロジェクト)でクリーンを実行されてはいかがでしょうか。

ちなみに私の環境では正常に動きます。

[環境] Windows7, VS2013update3, opencv2.4.9

コード:

#pragma comment(lib, "opencv_core249d.lib")
#pragma comment(lib, "opencv_features2d249d.lib")
#pragma comment(lib, "opencv_highgui249d.lib")
#pragma comment(lib, "opencv_imgproc249d.lib")
#pragma comment(lib, "opencv_nonfree249d.lib")

//2.4以降はライセンスの関係でSURFを使用するために必要
#include <opencv2/nonfree/nonfree.hpp>

#include <iostream>
#include <string> 
#include <opencv\cv.h>
#include <opencv\highgui.h>

using namespace std;
using namespace cv;


int main(int argc, char *argv[])
{
	// (1)load Color Image
	const char *imagename = argc > 1 ? argv[1] : "test.bmp";
	Mat colorImage = imread(imagename, 1);
	if (colorImage.empty())
		return -1;

	// (2)convert Color Image to Grayscale for Feature Extraction
	Mat grayImage;
	cvtColor(colorImage, grayImage, CV_BGR2GRAY);

	// (3)initialize SURF class
	SURF calc_surf = SURF(500, 4, 2, true);

	// (4)extract SURF
	vector<KeyPoint> kp_vec;
	vector<float> desc_vec;
	calc_surf(grayImage, Mat(), kp_vec, desc_vec);

	// (5)draw keypoints
	cout << "Image Keypoints: " << kp_vec.size() << endl;
#if 1
	vector<KeyPoint>::iterator it = kp_vec.begin(), it_end = kp_vec.end();
	for (; it != it_end; ++it) {
		circle(colorImage, Point(it->pt.x, it->pt.y),
			saturate_cast<int>(it->size*0.25), Scalar(255, 255, 0));
	}
#else
	for (int i = 0; i < kp_vec.size(); i++) {
		KeyPoint* point = &(kp_vec[i]);
		Point center;  // Key Point's Center
		int radius;      // Radius of Key Point
		center.x = cvRound(point->pt.x);
		center.y = cvRound(point->pt.y);
		radius = cvRound(point->size*0.25);
		circle(colorImage, center, radius, Scalar(255, 255, 0), 1, 8, 0);
	}
#endif

	namedWindow("SURF", CV_WINDOW_AUTOSIZE);
	imshow("SURF", colorImage);
	waitKey(0);

	return 0;
}

na

Re: 画像処理プログラムの実行結果画像が表示されない

#3

投稿記事 by na » 5年前

>sleepさん
ご回答くださりありがとうございます。

>プロジェクトの「クリーン」もメニューのビルドの「クリーン」も試してみましたがデバッグした結果に変化はありませんでした。
>ちなみにクリーンは正常に終了しました。

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#4

投稿記事 by sleep » 5年前

あとは、
opencvのバージョンを上げる、くらいですかね。

先日、起きている問題は別ですが
ご自分の環境のopencvのバージョンを上げることで解決された質問者の方がいらっしゃいます。
vector でヒープメモリが壊れてしまいますが直し方がわかりません

コードは問題なさそうなので、他はちょっと思い当たらないですね。
お力になれず申し訳ないです。

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#5

投稿記事 by sleep » 5年前

ふと思ったのですが・・・
置いている画像ファイル名は合ってますよね?
nanashi さんが書きました: const char *imagename = argc > 1 ? argv[1] : "Alldrinkbottle.bmp";
画像ファイル名を間違えていて、
画像のロードに失敗すると、以下の時点でプログラムは終了します。

コード:

	if (colorImage.empty())
		return -1;
nanashi さんが書きました: プログラム '[8560] nakazawa_lab.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。
例えば、ブレークポイントを設定してみたり、
もしくは、以下のようにコードを変更して実行してみて、画像のロードに成功しているかを
確認されてみてはいかがでしょう?

コード:

	if (colorImage.empty()) {
		cerr << "colorImage.empty()" << endl;
		cin.ignore();
		return -1;
	}

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#6

投稿記事 by sleep » 5年前

あと、テスト用と割り切って使いまわしているプロジェクトだった場合
コマンド引数で画像ファイル名と全く関係ない文字列を渡してしまっている所為で
失敗している可能性もあります。

コード:

const char *imagename = argc > 1 ? argv[1] : "test.bmp";

NS

Re: 画像処理プログラムの実行結果画像が表示されない

#7

投稿記事 by NS » 5年前

>sleepさん
重ね重ねご回答くださりありがとうございます。

>opencvのバージョンを上げて(opencv2.4.9)実行してみましたが、デバック結果に変化はありませんでした。
>画像のファイル名もコマンド引数も特に間違っている様子はありませんでした(コマンド引数は”C:\Users\Owner\Documents\Visual Studio 2010\Projects\nakazawa_lab\drinkbottleall.bmp”としています。)
>コードの変更で分かったことですが、やはり画像のロードがうまくいっていないことが分かりました。しかし何故ロードが行えていないのかが分かりません。重ね重ね申し訳ありませんがご教授いただけないでしょうか?(一応以下に設定しているinclude・libraryファイルと追加の依存ファイルを載せます。またdllファイルの設定は必要なのでしょうか?)
includeファイル:C:\opencv-2.4.9\build\include;C:\opencv-2.4.9\sources\include
libraryファイル:C:\opencv-2.4.9\build\x86\vc10\lib

追加依存ファイル(Debug):
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#8

投稿記事 by sleep » 5年前

NS さんが書きました: >画像のファイル名もコマンド引数も特に間違っている様子はありませんでした(コマンド引数は”C:\Users\Owner\Documents\Visual Studio 2010\Projects\nakazawa_lab\drinkbottleall.bmp”としています。)
まず、ファイル名が違いますね。
ソースコード上では、「Alldrinkbottle.bmp」ですが、
コマンド引数では、「drinkbottleall.bmp」の様です。

とりあえず、一回 コマンド引数を消してしまってください。
それで、ソースコードが置かれている場所に画像ファイルを置いて
その画像ファイルの名前をソースコードにコピペして実行してみてください。
NS さんが書きました: >コードの変更で分かったことですが、やはり画像のロードがうまくいっていないことが分かりました。しかし何故ロードが行えていないのかが分かりません。重ね重ね申し訳ありませんがご教授いただけないでしょうか?(一応以下に設定しているinclude・libraryファイルと追加の依存ファイルを載せます。またdllファイルの設定は必要なのでしょうか?)
ビルドが成功しているのであれば、
includeファイルへのパスの設定とlibraryファイルの参照設定は大丈夫です。
dllですが、一般のアプリケーション(exeファイル)などと同様に
環境変数の「Path」へdllが置かれている場所を追記しておく必要があります。
実行時に環境変数の「Path」を辿って dll を探し、動的リンクをしようとします。

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#9

投稿記事 by sleep » 5年前

あと、以下のコマンド引数についてですが、
コマンドプロンプトを開き、コマンド引数に設定しているパスをコピペして実行してみてください。
パスが正しければフォトビューアーで開けます。
が、間違っていれば開けません。

それで確認をしてみてください。
NS さんが書きました: >画像のファイル名もコマンド引数も特に間違っている様子はありませんでした(コマンド引数は”C:\Users\Owner\Documents\Visual Studio 2010\Projects\nakazawa_lab\drinkbottleall.bmp”としています。)
開けるパスを確認できたものをコマンド引数にセットして試してみてください。

NNS

Re: 画像処理プログラムの実行結果画像が表示されない

#10

投稿記事 by NNS » 5年前

>sleepさん
重ね重ねご回答くださりありがとうございます。

>画像ファイルは半角英数の名前のファイルの方がいいかと思いリネームしておきました。余計な勘違いをさせてしまいすいません。
>ソースと同じ場所にファイルをコピーとして実行させましたが結果は変わりませんでした。またもう一つ提案して下さったコマンドプロンプトからのコマンド引数を使った確認ですが、コマンドプロンプトはMS-DOSの方ですか?それともプロジェクトの実行ファイルのプロンプトからですか?またその際の実行コマンドはどう打てばよろしいでしょうか?解決に至らず大変申し訳ございませんが、よろしければご教授の程よろしくお願いいたします。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: 画像処理プログラムの実行結果画像が表示されない

#11

投稿記事 by へにっくす » 5年前

すみませんがNo.1、3、7、10の名前がそれぞれ違いますね。
「あなただれ?」状態ですよ。
同一人物なら名前を統一してください。

また、フォトビューアーで開けたのですか?
sleepさんがNo.9で言ってることは、次のようなことです。

コマンドプロンプト(と言われたら通常MS-DOSのことですよ)で

コード:

>drinkbottleall.bmp
上のように読み込みたいファイル名でフォトビューアが見れるようなら、その状態で

コード:

>nakazawa_lab.exe drinkbottleall.bmp
と打ってみた結果を教えてください。
(上記の例はexeとbmpのファイルが同一のフォルダにある場合です)
オフトピック
ちなみにMS-DOSという言い方は古いです。
よく知ってますね・・・
written by へにっくす

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#12

投稿記事 by sleep » 5年前

へにっくすさん、フォローありがとうございます。


nanashiさん、報告内容からは確認ができないことがあるので
再度確認をさせてください。
NNS さんが書きました: >ソースと同じ場所にファイルをコピーとして実行させましたが結果は変わりませんでした。
私は「コマンド引数を削除してください」とお伝えしましたけど、削除されましたか?
あと、ソースコードと同じ場所に置いた bmpファイルの名前と
以下のソースコードの bmpファイルの名前を一致させましたか?

コード:

const char *imagename = argc > 1 ? argv[1] : "Alldrinkbottle.bmp";
理解していただきたいことは、ソースコードを見れば分かりますが
コマンド引数が指定されていた場合、必ずコマンド引数の方しか実行されません。
コマンド引数のパスが間違えていると永遠に失敗します。
なので、コマンド引数を消した上で、ファイル名を一致させて実行を試していただきたいのです。
大丈夫でしょうか?
まずはパスを設定しなくてもファイルを読み込めるかどうかを確認してください。
コマンド引数を使用して動きを確認するのはその後です。

NNS さんが書きました: またもう一つ提案して下さったコマンドプロンプトからのコマンド引数を使った確認ですが、コマンドプロンプトはMS-DOSの方ですか?それともプロジェクトの実行ファイルのプロンプトからですか?またその際の実行コマンドはどう打てばよろしいでしょうか?
へにっくすさんが教えてくださってますが、
nanashiさんがおっしゃっているMS-DOSの方です。(この際定義はとりあえず置いときます)
画面が表示されたら、コマンド引数で指定しているものをそっくりそのまま使ってください。
(コピペでOK)打ち込んだらEnterキーを押してください。
(※当然、bmpファイル名は存在するものときちんと合わせてくださいね)
そうすると、Windowsは拡張子にあわせたアプリケーションが起動するように設定されているので
パスとファイル名が合っていれば、勝手にフォトビューアーで画像で表示されます。
間違っていると表示されません。
フォトビューアーで表示できたら、パスに問題が無いということです。
表示に成功したファイル名を含むフルパスならプロジェクトのコマンド引数に設定していただいても大丈夫です。
NS さんが書きました: またdllファイルの設定は必要なのでしょうか?
環境変数のPathは設定されましたか?

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#13

投稿記事 by sleep » 5年前

現状の段階で結論を出すには早いですが、
私の勘では、コマンド引数が全ての元凶だと思ってます。
NS さんが書きました: >画像のファイル名もコマンド引数も特に間違っている様子はありませんでした(コマンド引数は”C:\Users\Owner\Documents\Visual Studio 2010\Projects\nakazawa_lab\drinkbottleall.bmp”としています。)
掲示板上ではダブルクォーテーションで文字列が括られていますが、
実際のコマンド引数では括られていないと予想します。
文字列中にスペースが含まれているので、括られてなければ失敗します。

なぜなら、掲示板上のダブルクォーテーションは全角文字だからです。

nanashi
記事: 2
登録日時: 5年前

Re: 画像処理プログラムの実行結果画像が表示されない

#14

投稿記事 by nanashi » 5年前

nanashiです。
>sleepさん、へにっくすさん
ご回答くださりありがとうございます。

>ユーザー名が変わっているのは返信する毎に”入力したユーザー名は既に使用されています。別のユーザー名を使用して下さい。”と言われるため名前を変えて投稿しているためです。
>MS-DOSという言葉は以前から知っていたのでその呼び方で書きました。それでプロンプトでコマンド引数を用いてへにっくすさんから指摘して下さったコードを入力し実行してみた所、見事結果のフォトビュアーを開くことができました。お二方ともども回答・ご教授していただきどうもありがとうございました。
>しかしプロジェクトからデバックした場合は、まだ結果の画像が出てこない状況です。sleepさんのご指摘通りに
・フォトビュアーの表示に成功したフルパスをプロジェクトのコマンド引数に設定して実行
・コマンド引数を消してファイルの名を一致させて実行
(コマンド引数はダブルクォーテーションで括ってあります。exeファイルと同じ場所へ画像ファイルも置いてあります。)
してみましたが、どちらの方法を試しても結果の画像を表示させることはできませんでした。(ちなみに環境変数Path(システム環境変数)の設定はしっかり行えています。コマンドプロンプトのPathコマンドで確認してみてもopencv2.4.9のパスはちゃんと設定されていました。)
>一応結果は表示させることは出来たので、解決済みとしてここで終わりたいと思います。回答していただき、どうもありがとうございました。大変助かりました。

sleep

Re: 画像処理プログラムの実行結果画像が表示されない

#15

投稿記事 by sleep » 5年前

困ったものですね・・・
プライドが高いのも結構ですが、本当に人の話を聞かない方ですね。
nanashi さんが書きました: >しかしプロジェクトからデバックした場合は、まだ結果の画像が出てこない状況です。sleepさんのご指摘通りに
・フォトビュアーの表示に成功したフルパスをプロジェクトのコマンド引数に設定して実行
・コマンド引数を消してファイルの名を一致させて実行
(コマンド引数はダブルクォーテーションで括ってあります。exeファイルと同じ場所へ画像ファイルも置いてあります。)
sleep さんが書きました: とりあえず、一回 コマンド引数を消してしまってください。
それで、ソースコードが置かれている場所に画像ファイルを置いて
その画像ファイルの名前をソースコードにコピペして実行してみてください。
VS上でデバッガ実行しておいて、exeファイルの場所へ画像ファイルを置いて表示されるわけがないですよね。
どの場所がカレントディレクトリとして認識されているのか分かってませんよね。
nanashi さんが書きました: >一応結果は表示させることは出来たので、解決済みとしてここで終わりたいと思います。回答していただき、どうもありがとうございました。大変助かりました。
opencvはソースコードが公開されているんです。
コマンド引数を利用して表示ができた、という時点でバレてます。
fopenしているだけのコードで、「ファイルが開けません。」と自分が言っていたことに気付いてください。
恥ずかしくても素直に自分のミスは認めた方がいいです。
それに誰でもミスはします。
誰もそんなところを責めたりする人はいないので、安心してください。

閉鎖

“C言語何でも質問掲示板” へ戻る