自作でプログラムを組み、遊んでいたところ次のエラーが出て
実行できなくなりました。
メモリー不足が原因なのでしょうか?
動作環境は、VC++2010Express、opencv2.4.9です。
以下にエラー画像をのせます。
多くの意見ありがとうございました。
全プログラムをのせます。
アドバイスをいただけたらと思います。
よろしくお願いします。
プログラムとしては、キーを押したら画像を保存して
マッチングを行うことを繰り返すものです。
//静止画像をマッチング改良版(カメラ使用) int main( int argc , char** argv) { int key;//キー入力用の変数 CvCapture *capture;//カメラキャプチャ用の構造体 IplImage *frameImage = NULL;//キャプチャ画像用IplImage char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前 #define LINE_THICKNESS 1 #define LINE_TYPE 8 #define SHIFT 0 IplImage * temp = NULL; IplImage * dst = NULL; IplImage * img = NULL; IplImage * grey_img = NULL; IplImage * grey_temp = NULL; IplImage * output =NULL; IplImage * copy_frameImage = NULL; CvRect rect; double max_inter1inkage=0; double min_inter1inkage=0; CvPoint max_point; CvPoint min_point; //カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { //カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } //Windowの生成 //cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE); //カメラ・デバイスから画像を取得 frameImage=cvQueryFrame(capture); //メインループ while ( 1 ) { //カメラからの入力画像1フレームをframeImageに格納する(画像加工不可) frameImage = cvQueryFrame( capture ); //frameImageをコピー copy_frameImage=cvCloneImage(frameImage); //ROIを用いて短形切り出し //IplImage* image = cvLoadImage("sign.bmp"); //画面中央にROI rect.x = cvRound(copy_frameImage->width * 0.25); rect.y = cvRound(copy_frameImage->height * 0.25); rect.width = cvRound(copy_frameImage->width * 0.2); rect.height = cvRound(copy_frameImage->height * 0.11); //ROI指定 cvSetImageROI(copy_frameImage, rect); //出力先指定 cvCloneImageでROIまるごとコピー output=cvCloneImage(copy_frameImage); //cvSaveImage("test.bmp", frameImage); //ROIを保存 output=cvCloneImage(copy_frameImage); //元の画像をコピー //ROIを表示 cvNamedWindow("Capture",CV_WINDOW_AUTOSIZE); cvShowImage("Capture",output); //画像を表示する //cvShowImage( windowNameCapture, frameImage ); //'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } else if( key == 'c') { int64 start = cv::getTickCount();//所要時間計測 cvSaveImage("sign.bmp", output ); //キーを押して保存 //cvNamedWindow("window picture",CV_WINDOW_AUTOSIZE); //cvShowImage("window picture",frameImage); //--------原画像を読み込む--------- img=cvLoadImage("sign.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み //---------テンプレート画像を読み込む------- temp=cvLoadImage("temp8.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保 //グレー・スケール画像用に領域確保 grey_img=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) grey_temp=cvCreateImage(cvGetSize(temp),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) dst =cvCreateImage(cvSize(img->width-temp->width+1,img->height-temp->height+1),IPL_DEPTH_32F,1); //領域確保 //グレー・スケールに変換して格納 cvCvtColor(img,grey_img,CV_BGR2GRAY); cvCvtColor(temp,grey_temp,CV_BGR2GRAY); //-------テンプレートマッチングを取る----- cvMatchTemplate(grey_img,grey_temp,dst,CV_TM_CCOEFF_NORMED); //-----------マッチング点を求める--------- cvMinMaxLoc(dst,&min_inter1inkage,&max_inter1inkage,&min_point,&max_point,NULL); //------マッチングを表示する----- //相関値0.75以下ならばLostを表示して次に行く if(max_inter1inkage>0.5) { //マッチング箇所を四角で描画 cvRectangle(img,min_point,cvPoint(min_point.x+temp->width,min_point.y+temp->height),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT); //画像を表示 cvNamedWindow("windowNameTemplate",CV_WINDOW_AUTOSIZE); cvShowImage("windowNameTemplate",img); //類似度表示 printf("Detection %lf\n",max_inter1inkage); } else { printf("Lost %lf\n",max_inter1inkage); } //タイマー終了 int64 end = cv::getTickCount(); double elapsedMsec = ( end - start )*1000/cv::getTickFrequency(); //タイマー表示 std::cout << elapsedMsec <<"ms" <<std::endl; } } //メモリ開放 cvReleaseCapture(&capture); cvDestroyWindow("windowNameCapture"); return 0; }
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/30 04:56
2016/06/30 05:00