ページ 11

OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 11:24
by あるf
カメラから得た動画像を、背景画像との差分を取って表示するプログラムを書いていましたが、エラーが発生してしまいました。
初めて見るエラー文なので対処がわからず困っています。グーグルで検索もしてみましたが、解決しませんでした。

このエラーが一度出てから、ほかの動いていたプログラムも同様のエラーが出るようになってしまいました。

ご教授よろしくお願いいたします。
エラー文と、最初にエラーを起こしたプログラムを下に載せます。

コード:



#include "opencv2\opencv.hpp"
#include<stdio.h>
 
#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu249d.lib")
  //  #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video249d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu249.lib")
   // #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video249.lib")
#endif




int main ( int argc, char **argv ){

  CvCapture *capture = 0;
  IplImage *frame = 0;
  double w = 640, h = 480;
  int c;

  
  IplImage *grayImage = cvCreateImage( cvSize(w, h), IPL_DEPTH_8U, 1);			//背景画像用IplImage
  IplImage *backgroundImage = cvCreateImage( cvSize(w, h), IPL_DEPTH_8U, 1);	//グレースケール用IplImage
  IplImage *differenceImage = cvCreateImage( cvSize(w, h), IPL_DEPTH_8U, 1);	//差分画像用IplImage
  
  char windowNameCapture[] = "Capture";			//キャプチャした画像を表示するウィンドウの名前
  char windowNameDifference[] = "Difference";	//背景差分結果を表示するウィンドウの名前

/*
  capture = cvCreateCameraCapture (CV_CAP_ANY);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
 
  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
*/

  //カメラを初期化する
  if(( capture = cvCreateCameraCapture(-1) ) == NULL ){
	  //カメラが見つからなかった場合
	  printf("カメラが見つかりません\n");
	  return -1;
  }

  // ウィンドウを生成する
  cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE );
  cvNamedWindow( windowNameDifference, CV_WINDOW_AUTOSIZE );

  // 初期設定を設定するためにカメラから画像取得
  frame = cvQueryFrame( capture );
  // frameをグレースケール化し、背景画像とする
  cvCvtColor( frame, backgroundImage, CV_BGR2GRAY );



  // メインループ
  while (1) {
    frame = cvQueryFrame (capture);
	cvCvtColor( frame, grayImage, CV_BGR2GRAY );
    cvAbsDiff( grayImage, backgroundImage, differenceImage );

	if( differenceImage->origin == 0 ){
		// 左上が原点の場合
		cvFlip( differenceImage, differenceImage );
	}

	//画像を表示する
	cvShowImage( windowNameCapture, frame );
	cvShowImage( windowNameDifference, differenceImage );

	//キー入力判定
    c = cvWaitKey (10);
	if (c == 'q'){
		break;
	}
	else if( c == 'r' ){		//rが押されたら、その時点でのキャプチャ画像を背景画像とする
		  frame = cvQueryFrame( capture );
		cvCvtColor( frame, backgroundImage, CV_BGR2GRAY );
	}

  }


  //
  cvReleaseCapture( &capture );
  cvReleaseImage ( &frame );
  cvReleaseImage ( &backgroundImage );
  cvReleaseImage ( &differenceImage );

  cvDestroyWindow( windowNameCapture );
  cvDestroyWindow( windowNameDifference );

  return 0;
}

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 11:32
by あるf
エラー文のせ忘れてました。すいません

20140907_cam color detect.exe の 0x75c9812f でハンドルされていない例外が発生しました: Microsoft C++ の例外: cv::Exception (メモリの場所 0x001af4bc)。


また、出力欄に表示される文を以下にのせます。

-------- 編集およびビルドの再開 --------

20140907_cam color detect.cpp
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(46) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(46) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(47) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(47) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(48) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(48) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
c:\users\user\documents\visual studio 2010\projects\20140907_cam color detect\20140907_cam color detect\20140907_cam color detect.cpp(96) : warning C4129: 'q' : エスケープ シーケンスとして正しく認識されませんでした。
--------------------- 完了 ----------------------


よろしくお願いします。

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 11:58
by usao
カメラから得られるフレーム画像のサイズと,
w,h で決めているバッファ領域のサイズとが異なっているとか?
(その場合,74行目以降で,frameと同サイズにバッファ群を作れば良いように思います)

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 13:04
by Ryo
あるf さんが書きました:このエラーが一度出てから、ほかの動いていたプログラムも同様のエラーが出るようになってしまいました。
まず、状況確認ですが、ほかのプログラムについて

・問題のプログラムと同様に、OpenCV+カメラを扱うプログラム
・実行時は同じカメラを対象としている

ということであっていますか?

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 15:33
by あるf
すいません、調べたもののバッファ領域をどのように確保するのかがわかりませんでした。申し訳ないのですが、具体的にどのようにすればよいのだ教えていただけるとありがたいです。


先ほどもう一度やり直したら、エラーがもともと出ていなかったほうのプログラムは正常に動作しました。
プログラムはカメラの映像を出力するだけのものです。そのほかの環境は全く同じです。

正常に動いたほうのプログラムを以下に示します。よろしくお願いいたします。

コード:


#include "opencv2\opencv.hpp"
#include <stdio.h>
 
#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu249d.lib")
  //  #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts249d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video249d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu249.lib")
   // #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts249.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video249.lib")
#endif


int main ()
{
  CvCapture *capture = 0;
  IplImage *frame = 0;
  double w = 320, h = 240;
  int c;

  capture = cvCreateCameraCapture (CV_CAP_ANY);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
 
  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

  
  // (3)カメラから画像をキャプチャする
  while (1) {
    frame = cvQueryFrame (capture);
    cvShowImage ("Capture", frame);

    c = cvWaitKey (10);
    if (c == 'q') break;
  }

  cvDestroyWindow ("Capture");
  cvReleaseImage (&frame);
  return 0;
}


Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 15:48
by usao
「バッファ」と書いたのは
grayImage だとか backgroundImage だとかいうやつのことです.
(「画像領域」とか書けばよかったですね)
これらのサイズが 640x480 として作られているけれども,
カメラから得られる画像のサイズがこれと等しいという保障が無いですよね?

なので,例えば,
frame = cvQueryFrame (capture);
として実際にキャプチャできた画像と同じサイズで grayImage 等を作ればどうですか?
という意味で書きました.
(サイズはcvGetCaptureProperty()で得ても良いです.)

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 16:02
by あるf
カメラの定格が640*480とあったので間違いはないと思い込んでいたのですが、調べてやってみます。
ありがとうございます。

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 16:25
by あるf
(前略)

コード:


int main ()
{
  CvCapture *capture = 0;
  IplImage *frame = 0;
  IplImage *backgroundImage = 0;
  double w = 640, h = 480;
  int c;

  capture = cvCreateCameraCapture (CV_CAP_ANY);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
 
  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
  cvNamedWindow ("GRAYIMAGE", CV_WINDOW_AUTOSIZE);


  cvCvtColor( frame, backgroundImage, CV_BGR2GRAY );

  
  // (3)カメラから画像をキャプチャする
  while (1) {
    frame = cvQueryFrame (capture);
    cvShowImage ("Capture", frame);
cvShowImage ("GRAYIMAGE", backgroundImage);

    c = cvWaitKey (10);
    if (c == 'q') break;
  }

  cvDestroyWindow ("Capture");
  cvReleaseImage (&frame);
  return 0;
}


Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 16:27
by あるf
すいません書いている途中で送信してしまいました。
無視してください。

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 16:36
by あるf
とりあえず動くプログラムからちょっとずつ加えて行って機能を実装しようと思って書いていたのですが、以下の //******追加した行 部分を入れると先ほどのエラーが出てくるようになるました。

どのように対処すればよいのか、私がまだ知識に乏しいため、なるべく具体的に書いていただけると助かります。よろしくお願いいたします。
とりあえず動かしたいです。




(前略)

コード:

int main ()
{
  CvCapture *capture = 0;
  IplImage *frame = 0;
  IplImage *backgroundImage = 0;
  double w = 640, h = 480;
  int c;

  capture = cvCreateCameraCapture (CV_CAP_ANY);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);
 
  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
  cvNamedWindow ("GRAYIMAGE", CV_WINDOW_AUTOSIZE);			//******追加した行



  
  while (1) {
    frame = cvQueryFrame (capture);
	cvCvtColor( frame, backgroundImage, CV_BGR2GRAY );


    cvShowImage ("Capture", frame);
	cvShowImage ("GRAYIMAGE", backgroundImage);		//******追加した行

    c = cvWaitKey (10);
    if (c == 'q') break;
  }

  cvDestroyWindow ("Capture");
  cvReleaseImage (&frame);
  return 0;
}



Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:09
by usao
21行目の cvCvtColor() の部分でエラー吐いて止まっている感じでしょうか?
もし症状がそうであれば,backgroundImage が作られていないからではないでしょうか.

(まず,どこまでは実行できてどこでエラー吐いて止まるのか,という情報を書いた方が伝わるのではないでしょうか.
 「何行目を実行しようとするとエラー出る」とか.

 VisualStudio デバッガ ブレークポイント ステップ実行 … 等々のキーワードで検索されると
 今の状況の打開に役立つ便利機能の解説が見つかるかも.)

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:13
by あるf
ご教授ありがとうございます。 ステップ実行したところ仰る通り、21行目でエラーが出ました。
作られていないというと、どのようにすれば動くのでしょうか。この命令で作られるのだと思っていたのですが。

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:27
by あるf
ステップオーバーでひとつずつ命令を見て行ったのですが、
backgroundImageにはnSIzeやnChannelが設定されているのに対し、frameはすべて???と表示されていました。

調べたところcvCvtColorは画像の大きさやdepthが等しいことなどが条件と書いてありましたが、これが原因なのでしょうか。

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:34
by usao
原因はそこだと思いますが,

>backgroundImageにはnSIzeやnChannelが設定されているのに対し、frameはすべて???と表示されていました。

これは逆ではないですか?
20行目
>frame = cvQueryFrame (capture);
の実行が終わった時点で,frameのメンバはまともな値になっていませんか?
(そして,backgroundImageの値は 初期化された値 0 のままなのでは?)

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:38
by usao
オフトピック
あ,あと
>cvReleaseImage (&frame);
これはやってはいけません.
(cvQueryFrame()で返された画像領域は書き換えたり解放したりしちゃダメ)

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:39
by あるf
ごめんなさい、逆でした。

+ backgroundImage 0x00000000 {nSize=??? ID=??? nChannels=??? ...} _IplImage *

+ frame 0x007af030 {nSize=112 ID=0 nChannels=3 ...} _IplImage *


という表示でした。

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 17:53
by usao
>cvCvtColorは画像の大きさやdepthが等しいことなどが条件

なので,backgroundImageを 「適切なサイズ(とdepth)」でcreateする必要がありますね.
(もともとのコードではcvCreateImage()の記述がありましたが,今のコードでは抜け落ちていますね)

で,「適切なサイズ」がわかるのは,
(cvSetCaptureProperty()がどんなサイズを指定しても100%成功するとかいう保証がないならば)
cvCreateCameraCapture()の後になるでしょうから,

>frame = cvQueryFrame (capture);
>として実際にキャプチャできた画像と同じサイズで grayImage 等を作ればどうですか?
>(サイズはcvGetCaptureProperty()で得ても良いです.)

……という感じです.

Re: OpenCV エラー ハンドルされていない例外

Posted: 2014年9月08日(月) 18:27
by あるf
解決しました!
皆様ありがとうございました。
特にusao様に深く感謝申し上げます。

frame = cvQueryFrame (capture);
の部分をステップで見たところキャプチャ画像サイズが320*240になっていました。
前に動作した、ただカメラの画像を表示するだけのプログラムが640*480で動作したのでこっちのプログラムでも行けると思っていました。

w , h を320と240になおしたところしっかりと背景差分できていて、ちゃんと動作しました。