OpenCVとOpenGLを用いたプログラムでウィンドウの右上の×を押したときに行う処理を書く方法は?

このQ&Aのポイント
  • OpenCVとOpenGLを用いたプログラムでウィンドウの右上の×を押したときに行う処理を意図的に実装する方法について教えてください。
  • OpenCVで物体を追跡し、OpenGLで絵を動かすプログラムを作成しています。そのためには、display()関数内でOpenCVを用いた画像処理プログラムを記述する必要があります。そこで、ウィンドウの右上の×を押したときにcvReleaseCapture(&capture)などの処理を行える方法を知りたいです。
  • プログラムの最後にはcvReleaseCapture(&capture)などのメモリ解放や終了処理を行う必要がありますが、ウィンドウの右上の×を押しても同様の処理を行いたいです。ウィンドウの右上の×を押したときにcvReleaseCapture(&capture)などを実行する方法を教えてください。
回答を見る
  • ベストアンサー

右上の×を押したときに行う処理を意図的に書きたい

今、OpenCVとOpenGLの両方を用いたプログラムを書いています。 OpenCVで物体を追跡したとおりにOpenGLで絵を動かそうとしており、 そのためには glutDisplayFunc(display); で呼び出しているdisplay()関数内で OpenCVを用いた画像処理プログラムを書く必要があると思っています。 しかし、cvCapture *captureなどとした場合、 cvReleaseCapture(&capture); などをプログラムの最後に行わなければなりません。 キーボードの「q」を打つことでメモリ解放および プログラムの終了をさせることができるのですが、 ウィンドウの右上の×を押しても同様の処理をさせたいと 考えています。 ウィンドウの右上の×を押してもcvReleaseCapture(&capture) などを行わせるにはどのように書けばよいのでしょうか?

  • vjpo
  • お礼率23% (17/71)

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

途中でreturnとかしていなければプログラムの最後に書けばいいです。×をクリックしても最終的にはここに来ますので。 実際は書かなくてもプロセス終了とともに自動的に開放されると思います。

vjpo
質問者

お礼

回答ありがとうございます!! 早速実装したいと思います!! 本当にありがとうございました!

関連するQ&A

  • opencvについて

    OpenCVの初歩のプログラムなんですが実行するとコマンドプロンプトと実行画面が出てきます。しかし実行画面には何も映りません。エラーも出ず、正しくビルドされています。使用しているwebカメラはMicrosoft社の「LifeCam VX-1000」です。初期設定も正しく設定しました。参考にしているものは、「OpenCV プログラミングブック 第2版」です。どなたかアドバイスお願いします。 プログラム↓ #include <stdio.h> #include <highgui.h> int main(int argc, char** argv) { CvCapture *capture; IplImage *frameImage; char windowNameCapture[] = "Capture"; capture = cvCreateCameraCapture(0); cvNamedWindow(windowNameCapture, CV_WINDOW_AUTOSIZE); while (1) { frameImage = cvQueryFrame(capture); cvShowImage(windowNameCapture, frameImage); if (cvWaitKey(33) == 'q') break; } cvReleaseCapture(&capture); cvDestroyWindow(windowNameCapture); return 0; }

  • OpenCV webカメラ同時出力について

    opencvで画像処理をしています。 Webカメラを2台同時に出力させるプログラムをつくりたいと思っているのですが、方法が全く分かりません。 どうすれば2台同時に出力させることができますか? 1台だけ出力させるプログラムはこちらを使っています。 #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; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • opencv1.0 画面が真っ黒

    以前までXPを使用しVisual C++ 2008にopencv1.0を導入し、USB接続のwebカメラから 画像をキャプチャしリアルタイムでの画像処理などのプログラミングしていたのですが、 このたびOSをXP(32bit) からwindows7(64bit)に変え、前使っていた環境つまり Visual C++ 2008 opencv1.0 で設定したところ、コンパイルは正常にでき、普通にpng画像などを取り込むような画像処理は可能なのですが、webカメラからの画像が読み込めず、真っ黒な画像が表示されてしまいました。 ちなみに実行したプログラムはXPの時には正常に作動していたものと同じものを実行しています。 また、webカメラ自体はamcapなどのソフトを使い動作させることはできます。 自分なりに考えた問題点は、 プログラムに問題がある、またはvisualC++を2010にする、opencvを2.2などの最新版に 更新するなどがあげられますが、 この場合なにが原因として考えられるのでしょうか? その点アドバイスいただけたらうれしく思います。 よろしくお願いします。 実行したプログラムは以下の通りです(取り込んだ画像を表示しているだけの、シンプルなプログラムです。直すところなどありましたら教えてください。) *************************************************** #include <cv.h> #include <highgui.h> #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") int main(int argc, char** argv){ int key; CvCapture* capture; capture=cvCreateCameraCapture(-1); IplImage *frameImg =cvQueryFrame(capture); cvNamedWindow("Capture" ,CV_WINDOW_AUTOSIZE); while(1){ cvShowImage("Capture",frameImg); key = cvWaitKey(1); if(key=='q') break; } cvReleaseCapture(&capture); cvDestroyWindow("Capture"); return 0; } ****************************************************

  • openCVのエラー

    openCVの関数で cvCvtColor(frameImage, hsvImage, CV_BGR2HSV); というRGBからHSVへ変換する関数を openGLと組み合わせたプログラムで使用していたところ, コンパイルは通るのですが実行すると Bad number of channels (Incorrect number of channels for this conversion code) in function cvCvtColor. C:\User\VP\opencv\cv\src\cvcolor.cpp(2440) と表示されてエラーとなります. いったい何が原因なのでしょうか?? ちなみに上記関数はopenCVのみのプログラムでは正常に 動作したのを確認しました. また,エラーが出たプログラムでは, glutDisplayFunc(display); glutIdleFunc(idle); //idleの中身はglutPostRedisplay(); としており,このdisplay()関数内にて 上記関数を使用したところこのような現象が起こりました. 分かる方がいらっしゃいましたら,ご回答よろしくお願いいたします.

  • aviファイルの読み込み

    opencv2.2でaviファイルの読み込みを行うプログラムを作成しました。 しかし、コンパイルは通りますが実行されません。aviファイルはプロジェクトフォルダ内に入れてあるのでパスの間違いはありません。 どうしたら、動くようになるでしょうか? 環境はwindows7の64bitで、visual studio 2010で行っています。 ソースは以下の通りです。 ********************************* int main( int argc, char** argv ) { int k; //映像の読み込み CvCapture* capture; char* captureWindow = "Capture"; ////AVIファイルの読み込み・出力 if((capture = cvCaptureFromFile("pla.avi")) == NULL){ //ファイルが見つからないとき return -1; } img0 = cvQueryFrame(capture); //キャプチャサイズを知るために画像取得 cvNamedWindow( "入力", 1 ); //キャプチャしたフレーム画像をsave[]に格納 for(k=1;;k++){ frame = cvQueryFrame(capture); if(frame == NULL) break; else{ img = cvCloneImage(frame); cvShowImage( "入力", img ); if(cvWaitKey(30) == '\x1b') break; } } cvReleaseCapture(&capture); cvDestroyWindow("入力"); return 0; } **************************** aviファイルはflashで作成したものをaviファイルに書き出したものです。

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

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

  • OpenCV プログラムについて

    webカメラを表示するプログラムをつくりました。 しかし、webカメラのウィンドウが小さいのでフルウィンドウにして表示させたいです。 どうすればフルウィンドウでwebカメラを表示することができますか? 解答よろしくお願いします #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; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • 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を用いてaviファイルの読み込み、および、書き込みをしようとしているのですが、 指定のaviファイルが見つかりませんでした. というエラー処理の表示しか行われず困っています。 教えていただけませんでしょうか? よろしくお願いします。 読み込もうとしているファイルはデスクトップ上のOpenCVというフォルダのinput.aviというファイルです。 プログラムは以下に残します。 #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <stdio.h> //読み込む動画ファイル名 char* input_filename="input.avi"; //書き込む動画ファイル名 char* output_filename="output.avi"; //IplImage IplImage* src; IplImage* gray; IplImage* canny; int main(){ CvCapture* capture = NULL; int key; //キー入力 // Cannyオペレータのパラメータ------ double low_threshold=50.0; double high_threshold=200.0; int aperture_size=3; //--------------------------------- // ファイル書き込み設定-------------- CvVideoWriter *writer = 0; int isColor = 1; int fps = 30; // フレームレート int frameW = 320; // width int frameH = 240; // hight //----------------------------------- //指定したAVIファイルが見つからない場合は終了 if(NULL==(capture = cvCaptureFromAVI(input_filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } gray = cvCreateImage( cvSize(frameW,frameH), IPL_DEPTH_8U, 1 ); canny = cvCreateImage( cvSize(frameW,frameH), IPL_DEPTH_8U, 1 ); gray->origin = 1; //orginを入力側に合わせる canny->origin = 1; //orginを入力側に合わせる writer=cvCreateVideoWriter(output_filename,-1,fps,cvSize(frameW,frameH),isColor); //画像表示ウィンドウの準備 cvNamedWindow("Edge Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Edge Image", 50, 50); //処理ループの開始 for(;;){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //グレースケールに変換 cvCvtColor(src, gray, CV_BGR2GRAY); //Cannyオペレータによるエッジ検出 cvCanny(gray, canny, low_threshold, high_threshold, aperture_size); //フレーム書き込み cvWriteFrame(writer,canny); //画像表示 cvShowImage("Edge Image", canny); //キー入力 key = cvWaitKey(20); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseVideoWriter(&writer); cvReleaseCapture(&capture); cvReleaseImage(&src); cvReleaseImage(&gray); cvReleaseImage(&canny); cvDestroyWindow("Edge Image"); return 0; } 以上です。 よろしくおねがいします。

専門家に質問してみよう