Opencvのエラーについて

このQ&Aのポイント
  • Opencvでカメラからの画像をキャプチャし、保存するシステムを作っているのですが、写真のようなエラーがはかれてしまいます。
  • 純粋に再起動をかけているだけだからエラーがでるのが不思議ですし、OpenCVのプロジェクト単体では、問題なく動作します。
  • まったく理由がわからないので、わかる方どうぞよろしくお願いします。
回答を見る
  • ベストアンサー

Opencvのエラーについて

Opencvでカメラからの画像をキャプチャし、保存するシステムを作っているのですが、写真のようなエラーがはかれてしまいます。 現在開発済みのもの:VB2010でのプロジェクト・OpenCVでのプロジェクト (1)Form1を起動(VB2010) & ShellでOpenCVのプロジェクトのexeファイルを実行(OpenCV) (2)Form1に配置したボタン1を押す → OpenCV側にキーを送り、写真を撮影・保存 (3)Form1に配置したボタン2を押す → Form1を再起動 & OpenCV側にキーを送り、OpenCVのプロジェクトを再起動 → ボタン1を押すと添付写真のようなエラーがはかれます。 純粋に再起動をかけているだけだからエラーがでるのが不思議ですし、OpenCVのプロジェクト単体では、問題なく動作します。 まったく理由がわからないので、わかる方どうぞよろしくお願いします。

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

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

それぞれどんなプログラムになってるかわかりませんが。 エラーメッセージからすると、cvSaveImageで失敗しているように思えます。 それから推測するに ・変数等が初期化がされていないためファイル名が不正だったり、IplImageが不正だったりしている ・エラー処理が不十分で、撮影が正常にできてないのに保存しようとしている ・ファイル名が固定で、上書き保存している場合、別のプログラム(例えばForm1)が使用中 等が思いつきます。

airtrek1987
質問者

お礼

ご回答ありがとうございます!! ひとつひとつ試してみます♪

関連するQ&A

  • OpenCVの静止画保存のセルフタイマー

    投降させていただきます。 VC++2008、windowsXPでOpenCVを使ってプログラムを作っています。 OpenCVのサンプルを使ってカメラを起動し、静止画をボタンを押すことで保存することはできるようになりました。 これをアレンジして、静止画をセルフタイマーで自動に保存するようなプログラムを作りたいと考えています。 //画像表示と保存 while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } // 'c'キーが入力されったら画像を保存する else if(key=='c'){ sprintf(filename,"C:/Documents and Settings/ryoji/My Documents/My Pictures/frame%d.bmp",count); cvSaveImage(filename,frameImage); count++;   } } これでqキーを押せばループを抜け、cキーが押されたら保存できます。 このcキーを押すことで保存されるのを、5秒毎に保存するようなプログラムをつくりたいです。 5秒後、10秒後、15秒後・・・といった形です。 ご回答のほどよろしくお願い致します。

  • Visual C++,OpenCVでのリンクエラー

    こんにちは。 現在、Microsoft Visual C++ 2010 の環境で、OpenCV(ver2.3.1)を用いて、画像認識のアプリケーションを作ろうと考えています。ただ、Visual C++ 、OpenCV共に扱うのが初めてで、openCVのライブラリーをC++に認識させることができていません。 具体的には、下記の様なエラーが出ます。 「 Sample.obj : error LNK2019: 未解決の外部シンボル _cvReleaseImage が関数 _wmain で参照されました。 (同様に、以下の外部シンボルも参照できていません。_cvDestroyAllWindows、_cvWaitKey、_cvShowImage、_cvSmooth、_cvCreateImage、_cvGetSize、_cvNamedWindow、_cvLoadImage) 」 リンクの設定が上手くできていないと考え、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 全般 > 追加ライブラリディレクトリ に、C:\opencv\build\x64\vc10\lib というように記入し(64bit環境です)、また、 プロジェクト > ○○のプロパティ > 構成プロパティ > リンカー > 入力 > 追加依存ファイル に、opencv_core231d.lib;opencv_imgproc231d.lib;opencv_highgui231d.lib;opencv_objdetect231d.lib;opencv_contrib231d.lib;opencv_features2d231d.lib;opencv_flann231d.lib;opencv_gpu231d.lib;opencv_haartraining_engined.lib;opencv_legacy231d.lib;opencv_ts231d.lib;opencv_video231d.lib を追加しております。 実行しているサンプルファイルは下記になります。 -------------------- // Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // 『C:\OpenCV2.3\include』を追加のこと #include "opencv2\\opencv.hpp" #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231d.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_core231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_imgproc231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_highgui231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_objdetect231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_contrib231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_features2d231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_flann231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_gpu231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_legacy231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_ts231.lib") #pragma comment(lib,"C:\\opencv\\build\\x64\\vc10\\lib\\opencv_video231.lib") #endif int _tmain(int argc, _TCHAR* argv[]) { //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ return 0; } //表示ウィンドウの作成 cvNamedWindow("src"); cvNamedWindow("dst"); //処理後画像データの確保 IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels); //画像処理例(ガウシアンフィルタ) cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9); //画像の表示 cvShowImage ("src", src_img); cvShowImage ("dst", dst_img); //キー入力待ち cvWaitKey (0); //全てのウィンドウの削除 cvDestroyAllWindows(); //画像データの解放 cvReleaseImage(&src_img); cvReleaseImage(&dst_img); return 0; } --------------- 初心者な質問で大変恐縮ながら、どこを修正すればよいかお分かりでしたら、お教え頂けませんでしょうか?何卒宜しくお願いします。

  • OpenCVで画像保存を随時保存していくには

    OpenCVで画像保存を随時保存していくには 現在OpenCVでボタンを押すごとに画像を随時保存していくプログラムを作っているのですが、わからなくなってしまった次第です。 ↓は一部抜粋 int count = 0; (略) } else if (key == 'a' ){ //'a'キーが押されたらresult画像を保存 sprintf(filename,"image/result%d.jpg",count); cvSaveimage(filename,resultImage); //cvSaveImage("image/result%d.jpg", resultImage); count++; } という感じに作りました。 自分のイメージとしては、imageフォルダにresult0からaを押すごとにresult1・result2と保存していく用にしたと思ったのですが、実際にはresult.jpgしか保存されず、それに上書きしかされません。 どうすればいいか、教えていただけると幸いです。

  • Opencv画像処理 bmp処理

    常々自分の理解力の無さに呆れるyuki-yutoです。 今回はOpencvで作ったプログラムと別のプロジェクトで作ったプログラムをソースをコピーして一つにしたところ、オバーフロー?してしまうらしくプログラムが実行できません。 二つ別々なら動くので関数の受け渡しが悪いのでしょうか? 今回の処理の目的は Opencvでキャプチャ→bmpで保存→(書いていませんが)for文でRGBの量を求める→一定量のRが検出されればショートカットを起動する というものです。 RGBに関してはfor(i=0;i<width;i++)とかでまわしているソースを何処かで見た気がするのですが、bmp処理は疎いので正直RGBをどうやって出すかまだ良くわかっていません。 widthまでを使っているあたり1pixel毎配列にでも記録させているのでしょうか・・・? #include <stdio.h> #include <Windows.h> //bmp読み込み,ショトカ #include<iostream> #include <C:\OpenCV2.1\include\opencv\cv.h> #include <C:\OpenCV2.1\include\opencv\highgui.h> #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210d.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210d.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210d.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cv210.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cxcore210.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\cvaux210.lib") #pragma comment(lib,"C:\\OpenCV2.1\\lib\\highgui210.lib") #endif #include <math.h> #include <stdlib.h> int main(void){ //画像保存用 char str[32];//大きさは多く取っておいたほうが良いかも?640*480対応できるように。 //キー入力用 int key; //カメラの用意 CvCapture *capture; IplImage *frame = NULL; //カメラ画像用 //カメラ・デバイスの先頭ポインタを取得 capture = cvCaptureFromCAM(-1); //カメラ画像のサイズ double height = 240; double width = 320; //カメラ初期化 if(capture == NULL){ //カメラが見つからなかった場合 printf("カメラが見つかりません\n"); return (0); } //カメラ画像を表示するウィンドウの生成 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height); cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width); cvNamedWindow("CaptureFromCamera", CV_WINDOW_AUTOSIZE); //キー入力されたら画像をキャプチャ while(1){ //カメラ画像からフレーム画像を取り込む frame = cvQueryFrame(capture); if(frame == NULL) break; //画像の表示 cvShowImage("CaptureFromCamera", frame); //sキー入力で画像を保存、Escキー入力でループから抜ける key = cvWaitKey(10); if(key == '\x1b') break; else if(key == 's'){ sprintf_s(str, "Capture_Bitmap.bmp"); cvSaveImage(str, frame); } } //ウィンドウの破棄 cvDestroyWindow("CaptureFromCamera"); } //ここからキャプチャしたbmp処理。 int main( int argc, char *argv[] ){ FILE *fp; //ポインタ、読み込み専用 BITMAPFILEHEADER bfh; //ファイルヘッダ BITMAPINFOHEADER bmpinfo; //情報ヘッダ //BMPファイルがあるかどうかチェック if((fp=fopen("Capture_Bitmap.bmp","rb"))==NULL){ printf("ファイルが見つかりません"); exit(1); } //BMPファイルか確認 fread(&bfh, 14, 1, fp); //ファイルヘッダ読み込み,ってかファイルヘッダの1~14を読み込む if(memcmp(&bfh.bfType,"BM",2)) //BMPファイルかチェック、2バイト位置にBMがあるか printf("BMPファイルではありません"); fread(&bmpinfo, 40, 1, fp); //情報ヘッダ読み込み printf("データの大きさは%dMB\n",(bmpinfo.biSizeImage+bmpinfo.biSize)/1000000); //表示サイズ調節 //何色BMPファイルか返却値で判定 switch(bmpinfo.biBitCount){ case 1: printf("2色ビットマップ\n"); break; case 4: printf("16色ビットマップ\n"); break; case 8: printf("256色ビットマップ\n"); break; case 24: printf("1677色ビットマップ\n"); break; case 32: printf("1677色ビットマップ\n"); break; } //ココでRGBを抽出する、確かforを二回bmpの縦と横の最大値まで繰り返し、何か変数に入れるソースを見た気が・・・? printf("インターネット ショートカット を起動します。Enterを押してね"); getchar(); //ショトカ起動文。Windows.hでデスクトップにショートカットを指定。 fclose(fp); rewind(stdin); getchar(); }

  • サーバーに保存されているVB6で作成したexeをWEBで実行したいので

    サーバーに保存されているVB6で作成したexeをWEBで実行したいのですが下記エラーがでてきます。 エラーActiveXコンポーネントはオブジェクトを作成できません"Wscript.Shell" "Wscript.Shell"に原因があるみたいなのですが、どのようにしたらいいでしょうか。 個別テスト ・サーバでProject1.exeをダブルクリックすると正常起動します。 ・クライアントPCでもProject1.exeダブルクリックすると正常起動します。 ・クライアントPCでIISを起動しWEBで下記ソースを実行すると正常起動します。 環境 サーバー Windows Server 2003 IIS クライアント Windows XP 【ソース】 <html> <head> <title>サンプル</title> <script language="VBScript"> Sub Sample4() Dim WshShell Set WshShell = CreateObject("Wscript.Shell") '実行 WshShell.Run "C:\Inetpub\wwwroot\test1\Project1.exe" , 1 , True End Sub </script> </head> <body> <form name="frm1"> <span id="txt1"></span> <br> <input type=button value="テスト" name="btn1" onclick="vbscript:Sample4()" /> </form> </body> </html>

  • ユーザーコントロールの画像のコピー

    VB2005で開発しているのですが、プログラミングとはちょっと関係ないことなのですが、教えてください。 VB2005のFormに配置したユーザーコントロールを画像として保存する方法はありますでしょうか? 簡単な説明書を作りたいのですが、Form上のボタンや、カレンダーを画像(bitmap形式)をはりつけて表示して説明したいのですが、何か良い方法はありますか? よくわかっていないので、変な質問かもしれませんがアドバイスでも結構ですのでよろしくお願いします。

  • OpenCVによる連続静止画保存

    OpenCVとVisual Studio 2005を使ってカメラ画像を出力し、キーを押すことで画像をファイルに保存しています。しかし、キーを押すたびに画像が上書きされてしまい、結局保存ファイルは一つだけになってしまい連続して画像ファイルが取得できません。下記のプログラムで下のほうに書いてあるcvSaveImage()関数にうまくカウンタを使ってやればいいと思うのですが、私の技量ではできませんでした。知っている方がいたら教えてください。よろしくお願いします。 //--------------------------------------------------------- // 概要 : カメラからの入力画像をそのまま表示 // File Name : image.c // Library : OpenCV for MS-Windows 1.0 //--------------------------------------------------------- #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; }else if( key == 'c'){ cvSaveImage("picture.bmp", frameImage ); } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • Shellで起動したプログラムのウィンドウ表示位置

    vbからshellを使って、cで書いた実行ファイルを起動しています。 その起動した実行ファイルの表示位置を指定したいのですが、どうしたらよいのかわかりません。 もしかしてshellでは無理なのでしょうか? それともcのコードに変更を加えるべきなのでしょうか? cの方はOpenCVで、ウィンドウ生成が「cvNamedWindow(windowName名前)」で行っているので、 これもどう位置を指定したらよいのかわかりません。。。 どなたかわかる方よろしくお願いします。

  • 【VB2005】別のプログラムから別のプログラム起動

    "A"というVB2005で、作成したプログラムがありまして、 メインのフォームがあり、 そこにボタンがあります。 Shellの関数を使って、クリックイベントで、 指定したExe"B"を立ち上げます。 そのExe"B"は、VB2005で作成したオリジナルのプログラムです。 プロジェクトは別で作った物と考えてください。 Exe"B"を起動した画面を[フォーム1]と考えて、 ボタンがあり、クリックすると 別の[フォーム2]が表示するはずなのですが、 特にエラーも掴まずに、Showで開くことができません。 しかし、Exe"B"からダイレクトに起動させて ボタンをクリックしたら[フォーム2]が表示されます。 どうしたら、Exe"A"からExe"B"を起動して Exe"B"からフォーム2を呼び出すことができるか、 考えられる要因などをアドヴァイスして頂けたら助かります。

  • Visual Basic 2008 Express Edition の「form.vb [デザイン]」の画面

    Visual Basicを始めて使いました。 Visual Basic 2008 Express Editionです。 buttonやLabelなどを付けて、プログラムを書いて、保存しました。 そして一度Visual Basicを閉じて、また起動しました。 そして「最近使ったプロジェクト」でさっき保存したプロジェクトを開いたんですが、「Form1.bv [デザイン]」の画面がありません。 プログラムが書いてある「Form1.bv」の画面は開いています。 ボタンの位置などを変えたいので「Form1.bv [デザイン]」を開きたいのですが、どうやって開くんでしょうか。 教えてください。よろしくお願いします。

専門家に質問してみよう