• 締切済み

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 です。 どなたかご教授お願いいたします。

noname#123915
noname#123915

みんなの回答

回答No.1

成功例と失敗例の違いがわかりませんが。 > char filename[]; //出力画像の名前 空の配列だけ用意しても、ファイル名を入れるメモリは確保されませんよ。 char filename[_MAX_PATH]; ではどうでしょうか。

noname#123915
質問者

補足

すいません;失敗例の記述を間違えました;; 正しくは 成功例 sprintf(file,"test.bmp"); cvSaveImage(file, testimage); でした。 このように、フォルダの指定をはずしてやれば成功するのに指定してしまうととたんにエラーが出てしまいます。 あと、[_MAX_PATH]も試しましたが、同じようにエラーが出てしまいました。

関連するQ&A

  • 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ライブラリを用いて、C++を使い画像処理をしています。

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

  • OpenCvライブラリを使い、C++を用いてウェブカメラを監視カメラみ

    OpenCvライブラリを使い、C++を用いてウェブカメラを監視カメラみたいな役割をさせようとしています。 そこで、1秒ごとに画像をキャプチャし、10秒(10枚)までを指定したフォルダに保存する。 (例)     ファイル名   1秒の画像   file1.bmp 2秒の画像   file2.bmp ・ ・ ・ ・   10秒の画像   file10.bmp と、こんな風に そして、保存していた背景画像と、1~10枚撮った画像を比較していき、違いが出たら、 違いが出た画像だけを別のフォルダに保存するというプログラムを作ろうとしています。 OpenCv,C++初心者なので、うまく伝えられているか分かりませんが、宜しければプログラムを教えてください。

  • VB6.0でエクセル保存する時の保存場所の指定。

    VB6.0からデータをエクセルに保存させようとしています。 保存する方法は、エクセルを開くのではなく、 ボタンを押したらそのまま自動で保存させるようにしています。 そしてその名前をつけて保存をさせる処理で、ファイルの保存場所を示す パスの指定で少々困っております。 EXEファイルがある位置をカレントとして同一フォルダ内にあるtestフォルダに 全てデータは保存したいと考えています。 絶対パスを固定で指定すればそこに保存できますが、それだと違うPC上で実行すると 動作しない危険性がありますので、相対パスで指定したいと思っています。 ですが、実行ファイルから"./test/test.xls"と指定してもパスのエラーとなり 保存できません。 しかし絶対パスの固定でフォルダを指定すると保存できます。 ws.Name = "C:\vb_test\test\test.xls" これをEXEファイルのある位置からの相対パスで指定するにはどうすればいいでしょうか?

  • 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形式にする ↓ ・変換した画像はファイルにではなく、プログラム中の変数に保存 ↓ ・プログラムが動いている間ずっとこの処理を行う というものです。 特に変換した画像をプログラムが動いている間、ずっと変数に保存し続ける方法がわかりません。 プログラム中の変数に保存したい理由は、保存したコマ画像を用いてテンプレートマッチングなどを行いたいからです。 どなたか教えていただけると助かります。

  • フォルダ参照ではなくファイルを指定したい。

    フォルダの参照ダイアログボックスを使用して ファイルを選択できるようにしています。 プログラムでcsv形式で保存し、そのcsv形式ファイルを指定して開くという動作を目的としています。 そのファイル選択を固定でなく可変で選択したいと思っています。 Dim ShellApp As Object Dim oFolder As Object Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "ファイル選択", &H4000,"C:\test") msgbox(oFolder) このような感じで、フォルダのみではなくファイルを指定することに成功しました。 しかし、このフォルダ参照ダイアログが表示されたときに、何も選択せずに キャンセルボタンをクリックするとエラーが出て止まってしまいます。 目的とする動作はできてはいるのですが、キャンセルするとエラーになるので、この原因がわからず困っています。 キャンセルボタンに関することを記述する必要があるのでしょうか? また、この他にファイルを指定するのに適した方法がありましたら教えてください。 参照するフォルダを指定しているのでパスの取得は必要ありません。 ファイルが選択できたらOKです。 フォルダのパス取得のプログラムはよくサンプルを見かけるのですが、 ファイル選択のサンプルはあまり見かけないです(-_-;) また、この方法ではC:\と絶対パスで指定していますが、exeファイルが存在する場所からの相対パスでの指定はできないのでしょうか? csvで保存する時は"./test/test.csv"などと記述して書き込みできていたのですが、 このようなパスを書くとエラーとなりファイルを見つけられないといわれてしまいます。

  • 画像保存について

    インターネットをしていて画像を保存する際、右クリックから、「名前を付けて画像を保存する」で保存しますね。 その後保存先を指定するときのファイルの種類が、いつもビットマップ(bmp)で、横の矢印で変更しようにもbmpだけなんですが、 bmpはファイルサイズが大きいのでjpgで保存したいと思っているのですが、そんなことは可能なんでしょうか?

  • 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を用いて"s"キーを押したら静止画保存が始まり、再度"s"キーを押したら保存が終了しるプログラムを作成しています。(保存レートは1秒間で30フレームの静止画保存で考えています)また、保存する静止画を指定したフォルダに保存するプログラムを作成していますが、プログラム作成の経験が浅く、なかなかうまく作れず困っております。どのようにプログラムを組めばこのようなプログラムが作れるのでしょうか。下記のプログラムは作成でき、これを基礎にして作り上げていこうと考えています。プログラムの内容としては"c"キーを押した分だけ、連番でbip形式で画像を保存するプログラムです。精度の関係上timegettime関数を使用したいと考えているのですが、、。 <ソースプログラム> #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用変数 int counter = 0; CvCapture *capture; // キャプチャ用構造体 IplImage *frameImage; // キャプチャ画像用IplImage char str[32]; char windowNameCapture[] = "CMOS Camera Image"; // ウィンドウネーム // カメラの初期化 if( ( capture = cvCreateCameraCapture(-1)) == NULL ){ // カメラデバイスが検出できない場合 printf("カメラデバイスを検出できません\n"); return -1; } // ウィンドウ生成 cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while(1){ // カメラからの1フレームをframeImageに格納 frameImage = cvQueryFrame( capture ); // 画像表示 cvShowImage( windowNameCapture, frameImage ); // 'ESC'キーが入力されたらループを抜ける key = cvWaitKey(1); if( key == '\x1b' ){ break; // 静止画保存 } else if( key == 'c'){ sprintf_s(str, "cmosview%04d.bmp",counter++); cvSaveImage(str, frameImage ); } } // キャプチャ解放 cvReleaseCapture( &capture ); // ウィンドウ破棄 cvDestroyWindow( windowNameCapture ); return 0; }

専門家に質問してみよう