OpenCVで画像保存を随時保存する方法

このQ&Aのポイント
  • OpenCVで画像保存を随時保存する方法がわからない
  • 現在OpenCVでボタンを押すごとに画像を保存していくプログラムを作っているが、上書きしかされない
  • どうすればimageフォルダにresult0からaを押すごとにresult1・result2と保存していけるかわからない
回答を見る
  • ベストアンサー

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しか保存されず、それに上書きしかされません。 どうすればいいか、教えていただけると幸いです。

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

  • ベストアンサー
回答No.1

ちょっと自分もそのプログラムを参考に作ってみました。 #include <stdio.h> #include <string.h> #include <conio.h> #include <cv.h> #include <highgui.h> #include <ewclib.h> #define xx 640 #define yy 480 int main (int argc, char *argv[]) { char filename[20]; int count = 0; IplImage *frame; cvNamedWindow("Movie"); // カメラの準備(ブラックボックス) ※CaptureFromCam()と同義 frame = cvCreateImage(cvSize(xx,yy),8,3); if(EWC_Open(0, xx, yy, 15, 0, MEDIASUBTYPE_RGB24)){ printf("Failed to open the camera device.\n"); getch(); return 1; } EWC_SetBuffer(0,frame->imageData); // ブラックボックスここまで while(1) { EWC_IsCaptured(0); // 1フレーム取得 ※CvQueryFrame()と同義 cvShowImage("Movie",frame); if(cvWaitKey(33)==13){ // Enterキー押下 sprintf(filename,"image/result%d.jpg",count); cvSaveImage(filename,frame); count++; printf("Successed : result%d.jpg\n",count); } if(cvWaitKey(33)==27) break; // ESCキー押下で終了 } } この場合はEnterを押すたびにimage/result○○.JPGを保存するプログラムになりました。 環境の都合上、CaptureFromCam()は用いずに、ewclib.hのライブラリを参照しているので、 そのあたりは置き換えてください。 自分もまだC言語初心者なので、偉そうなことはいえませんが、参考になれば幸いです。 あと、質問中の、 "cvSaveimage"→"cvSaveImage" ですが、これは打ち間違いでしょうかね・・・?

enchan01
質問者

お礼

ありがとうございます!! まさかの一番最後にあった訂正文を直したら、通ったという恥ずかしいミスをしていたようです;; しかしsoltyさんのプログラムを拝見させていただいて、ewclib.hを知ることが出来ました。 まだこのewclib.hに関しては全然分かってないので、学びつつ自分が作ったプログラムとどちらがいいか評価してみたいと思います。勉強になりました、ありがとうございました^^

関連する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秒後・・・といった形です。 ご回答のほどよろしくお願い致します。

  • OpenCVでの静止画像の保存

    書き込みさせていただきます。 今、OpenCVのサンプルにあるfacedetectをいじっているのですが、赤い円もしっかりと顔を認識することができました。 その中に静止画像の保存をするプログラムを入れたいのですが、実行をすると赤い円はしっかりと表示されるのですが、保存すると消えてしまいます。理由がまったくわからないので教えていただければ幸いです。 if( capture ) { for(;;) {      //カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); if( !cvGrabFrame( capture )) break; frame = cvRetrieveFrame( capture ); if( !frame ) break; if( !frame_copy ) frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels ); if( frame->origin == IPL_ORIGIN_TL ) cvCopy( frame, frame_copy, 0 ); else cvFlip( frame, frame_copy, 0 );    //画像を輝度画像に変換,縮小,ヒストグラムを平坦化 detect_and_draw( frame_copy ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); //cvShowImage( windowNameFace, faceImage ); //キー入力が行われるまで表示を続ける key = cvWaitKey( 2 ); //'c'キーが入力されったら画像を保存する if ( key == 'c' ){ sprintf(filename,"C:/Documents and Settings/ryoji/My Documents/My Pictures/CV-P/fame%d.bmp", count);  cvSaveImage(filename,frameImage);  count++; } // 'q'キーが入力されたらループを抜ける else if ( key == 'q' ){ break; } } cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } facedetectのファイルの中にcが押されたら保存、qが押されたら終了にしています。保存、終了ともにできていますが、赤い丸だけ消えます。 よろしくお願いします。

  • cvSaveImageで画像を保存する際のフォルダ指定

    現在C++,OpenCVを用いてプログラム内で生成した画像をフォルダを指定して1フォルダ内に100枚程度の画像をどんどん保存していくというプログラムを作成しています。 そこで、フォルダを指定してcvSaveImageで画像を保存しようとすると、エラーが出てしまい保存する前にプログラムがダウンしてしまいます。 具体的には以下のとおりです。 変数 char filename[]; //出力画像の名前 char path[] = "testdir";//相対パス名(フォルダ指定用) IplImage* testimage; //生成した画像 成功例(フォルダ指定なし) sprintf(file,"%s\\test.bmp",path,); cvSaveImage(file, testimage); 失敗例(フォルダ指定あり) sprintf(file,"%s\\test.bmp",path,); cvSaveImage(file, testimage); 環境は Win XP Pro 2002 sp3 Visual C++ 2008 Express Edition OpenCV1.1 です。 どなたかご教授お願いいたします。

  • OpenCVで処理した画像の表示方法。

    VC++でOpenCVを使って画像処理を研究中です。 OpenCVでの画像の表示は、 char *filename = "lena.jpg"; image = cvLoadImage(filename, CV_LOAD_IMAGE_COLOR); cvNamedWindow ("lena", CV_WINDOW_AUTOSIZE); cvShowImage ("lena",image); で出来るということは分かりました。 しかし、MFCで作ったフォームのピクチャーボックスへの表示の仕方が分かりません。 画像処理は実行ボタンでpictureBox1の元の画像をpictureBox2に表示させようと考えております。 回答のほど、どうぞよろしくお願いいたします。 また、分かりやすいサイトなどありましたらお願いします。

  • OpenCvライブラリを用いて、C++を使い画像処理をしています。

    OpenCvライブラリを用いて、C++を使い画像処理をしています。 私は今、人が映ったら保存するプログラムができています。 そこで、人が映るたび、ファイル名を自動的に変えてフォルダに保存していくプログラムが作れなくて困っています。 どのようにcvSaveImage関数を使えばよいのか教えてください。

  • OpenCVでキャプチャした画像をbmp保存したい

    OpenCVでカメラからキャプチャした画像(コマ画像)をbmpで保存しようと思っています。 以下のプログラムで一応bmp画像は保存できるのですが、キー入力をしないと保存できません。 #include <iostream> #include <stdio.h> #include <cv.h> #include <highgui.h> #include <math.h> #include <stdlib.h> int main(void){ //画像保存用 char str[32]; //キー入力用 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(str, "Capture_Bitmap.bmp"); cvSaveImage(str, frame); } } //キャプチャの解放 cvReleaseCapture(&capture); //ウィンドウの破棄 cvDestroyWindow("CaptureFromCamera"); } 自分が作りたいプログラムは、 ・カメラからコマ画像を取得 ↓ ・それをbmp形式にする ↓ ・変換した画像はファイルにではなく、プログラム中の変数に保存 ↓ ・プログラムが動いている間ずっとこの処理を行う というものです。 特に変換した画像をプログラムが動いている間、ずっと変数に保存し続ける方法がわかりません。 プログラム中の変数に保存したい理由は、保存したコマ画像を用いてテンプレートマッチングなどを行いたいからです。 どなたか教えていただけると助かります。

  • OpenCVを使って画像のノイズ除去を考えています

    OpenCVを使って画像のノイズ除去を考えています。 ですが、プログラムで上手く動いてくれないところがあり、分からなくて困っています。 もしわかる方がいらっしゃれば是非教えてください。 OpenCV2.4.6,VisualC++2010を用いています。 OpenCVを使わないLabeling.hなどを使った似たようなプログラムを教えてくださっても構いません。 ただ、Labeling.h自体がよくわからなく、Labeling.hを使って書いたプログラムが動かない状態であり、OpenCVの方がまだわかるので今回はOpenCVで質問しました。 プログラム(OpenCVを使った)の詳しい説明です。 入力画像の黒い点すべてがノイズだとします。またノイズのサイズは500以下だとします。 またサイズは特に指定はありません。拡張子は24bitのbmpを使っています。 画像の左側が入力画像とした時、画像の右側のように出力されます。(画像では分かりやすいように画像の切れ目を青の枠で囲っています。) 出力画像のふち?の部分が1ピクセルの範囲だけノイズ除去されずに残ってしまいます。(画像では分かりずらいですが赤の矢印の先の部分です。) 画像の下側のように赤のふち?1ピクセルの範囲はノイズ除去されません。 原因を考えているのですが、自分では分からなく困っています。 もしわかる方がいらっしゃれば是非教えてください。 私自身、プログラムは大学の授業レベル、OpenCVは使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。 プログラムの内容は以下のようになっています。 〇〇〇は入力画像のファイル指定先 ●●●は出力画像のファイル指定先 ノイズのサイズは500以下とします。 自分は輪郭追跡のcvPointの部分が怪しいと考えてます。 今書いてるプログラムから一部抜き出してきたのでもしかしたら余計な処理が入っているかもしれません。 一応コピペでライブラリの設定、入力・出力画像のファイル指定をしていただくと動くと思います。 #include "stdafx.h" #include <stdio.h> #include "opencv/cv.h" #include "opencv/highgui.h" int _tmain(int argc, _TCHAR* argv[]) { IplImage *Proc;//処理画像 int i; char input_fname[256]; //元画像読み込み先 char output_fname[256]; //処理後画像出力先 //輪郭情報 CvMemStorage* Storage;//メモリストレージ CvSeq* Contours=0;//輪郭データ int Count=0;//輪郭の数 double Area=0;//面積 Storage=cvCreateMemStorage(0);//メモリストレージを確保 sprintf(input_fname, "〇〇〇"); sprintf(output_fname, "●●●"); IplImage *Input = cvLoadImage( input_fname, CV_LOAD_IMAGE_GRAYSCALE); if( Input == NULL ){ printf("ファイルが読み込めません。\n"); cvWaitKey(0); // キー入力待機 return -1; } // (1)二値化(大津の手法を利用) cvThreshold (Input, Input, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//大津の二値化を用いて色を反転させる Proc = cvCreateImage(cvGetSize(Input), Input->depth, 1);//処理画像 cvCopy(Input,Proc,NULL); //輪郭を取得 Count = cvFindContours(Proc,Storage,&Contours,sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0)); //輪郭情報の取得 for(i=1;i<=Count;i++){ Area=abs(cvContourArea(Contours));//面積 if(Area<500){//面積が500以下の場合、黒で塗りつぶす cvDrawContours( Input, Contours, CV_RGB(0,0,0),CV_RGB(0,0,0), 0, CV_FILLED);} Contours=Contours->h_next;//次の輪郭へ } cvThreshold (Input, Input, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);//大津の二値化を用いて色を反転させる cvSaveImage(output_fname,Input);//矩形描画した画像を保存 //画像情報解放 cvReleaseImage(&Input); cvReleaseImage(&Proc); }

  • 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; }

  • 実行結果をフォルダに格納

     aviファイルの動画を1フレームずつの画像に分けていくプログラムを作りました。  hogehoge%05d.jpgで画像ファイルを生成していくようにしているのですが、この実行結果から得られた画像を、すべてフォルダに格納するように改良したいのです。どうしたらいいでしょうか?  プログラムは以下です。 ------------------------------- /* 警告warningを出なくする */ #pragma warning(disable : 4996) #pragma warning(disable : 4244) /* リンクするOpenCVライブラリ指定 */ #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"cv.lib") #pragma comment(lib,"highgui.lib") //#pragma comment(lib,"ipl.lib") #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cxcore.h" #include "cv.h" #include "image.h" //読み込む動画ファイル名 char* filename="result1.avi"; //IplImage IplImage* src; int main(){ CvCapture* capture = NULL; int key; //キー入力 int fileCount; char fileName[256]; //指定したAVIファイルが見つからない場合 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } //画像表示ウィンドウの準備 cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Source Image", 50, 50); //処理ループの開始 for(fileCount = 1;;fileCount++){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //画像表示 cvShowImage("Source Image", src); //画像保存 sprintf(fileName,"hogehoge%05d.jpg",fileCount); cvSaveImage(fileName, src); // //キー入力 key = cvWaitKey(10); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseCapture(&capture); cvDestroyWindow("Source Image"); return 0; } ---------------------------------

  • OpenCVで画像を読み込みたい

    OpenCVを勉強しようと思い先日始めました。 http://chihara.naist.jp/opencv/?FrontPage 上記のサイトに掲載されている通りにVC++ 2008 EEで ・環境変数PATH ・インクルードファイル ・ライブラリファイル ・リンカ の設定をしました。 これでいざプログラムをコンパイルして実行すると何故か画像が読み込んでくれません。 これらの設定以外の他にするべきことがあるのでしょうか? いきなり出鼻を挫かれたので困っています。よろしくお願いします。 OS:XP SP2 開発環境:VC++ 2008 EE 実行したプログラム ---------------------------------------------------------------- #include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* img; char* filename = "abc.bmp"; if( argc == 2 && (img = cvLoadImage( filename, 1)) != 0 ) { cvNamedWindow( "Image view", 1 ); cvShowImage( "Image view", img ); cvWaitKey(0); // イベント処理を含む場合には,これが重要. cvDestroyWindow( "Image view" ); cvReleaseImage( &img ); return 0; } return -1; } ----------------------------------------------------------------

専門家に質問してみよう