OpenCVによる時間差表示

このQ&Aのポイント
  • OpenCVを使用してカメラ画像に時間差で点を表示するプログラムを作成する方法を教えてください。
  • 点を中心、右隅、左隅、上、下の位置に表示し、中心は0秒から5秒まで、右隅は5秒から10秒まで、左隅は10秒から15秒まで表示するようにしたいです。
  • どのようにプログラムを作ればよいか分からないので、詳しい手順を教えていただけると助かります。
回答を見る
  • ベストアンサー

OpenCVによる時間差表示

書き込みさせていただきます。 今OpenCVをインストールしてVC++にてプログラミングをしています。 カメラ画像を取得してそこに点を打とうとしています。 //中心 cvCircle(frameImage,cvPoint(320,250),1,CV_RGB(0,255,0),5,8,0); //右隅 cvCircle(frameImage,cvPoint(635,250),1,CV_RGB(0,255,0),5,8,0); //左隅 cvCircle(frameImage,cvPoint(5,250),1,CV_RGB(0,255,0),5,8,0); //上 cvCircle(frameImage,cvPoint(320,470),1,CV_RGB(0,255,0),5,8,0); //下 cvCircle(frameImage,cvPoint(320,5),1,CV_RGB(0,255,0),5,8,0); のようにして無理やり点を作って表示させることができました。 この点を 中心→0秒から5秒まで表示 右隅→5秒から10秒まで表示 左隅→10秒から15秒まで表示 のように時間をずらして表示するようなプログラムを作りたいのですが、やり方が調べてもよくわかりません。 教えていただければ幸いです。 よろしくお願いいたします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

表示した丸は消すのでしょうか? 消すなら元画像と、そのコピーを準備しましょう 実行環境がWindowsであるならば _ftimeで時刻を取得し cvWaitKeyで時間待ちをします int WaitTime( long nTime ) {   // 待ち時間 nTimeは ms単位   struct _timeb buf1, buf2;   long nn = nTime;   int ch = 0;   _ftime( &buf1 );   while ( nn >= 0 ) {     ch = cvWaitKey( nn );     if ( ch == 27 ) {       // ESCが押されたら終了       return 1;     }     _ftime( &buf2 );     // 残りの待ち時間を算出     nn = nTime - ( ( buf2.time - buf1.time ) * 1000       + ( buf2.millitm - buf1.Millitm ) );   }   return 0; } といった具合の関数でどうでしょう # 開発環境や実行環境の情報も投稿しましょう # VC++6.0 Pro WinXPSP3 などと ・・・

k-ryoji
質問者

お礼

回答のほどありがとうございます。 また返事が遅くなってしまい申し訳ありませんでした。 がんばってやってみたいと思います。 ありがとうございました。

その他の回答 (1)

  • tholatin
  • ベストアンサー率0% (0/1)
回答No.2

似たようなプログラムを書いたことがあります(VC++2005). カメラのフレームレートを利用して時間を計測していました.だいぶ稚拙な出来ですが・・・ 以下では,自分でフレームレートを調べて変数”fps”に指定しています. カメラのフレームレートは確かopenCVの関数で取得できたはずですが,私の使っていたwebカメラからは取得できませんでした. -------------------- int fps = 15; // カメラのフレームレート int c = 0; // ここでは15秒でループは閉じることにしています while( c < 15 * fps ){ if( c < 5 * fps ){ cvCircle( frameImage, cvPoint( 320, 250 ), 1, CV_RGB( 0, 255, 0 ), 5, 8, 0 ); } else if( c < 10 * fps && c >= 5 * fps ){ cvCircle( frameImage, cvPoint( 635, 250 ), 1, CV_RGB( 0, 255, 0 ), 5, 8, 0 ); } else{ cvCircle( frameImage, cvPoint( 5, 250 ), 1, CV_RGB( 0, 255, 0 ), 5, 8, 0 ); } c++; //その他,表示など(省略します) cvWaitkey( 10 ); } --------------------- 質問からは,表示した点をずっと表示させたままなのか,違うところに点を描いたら前の点は消すのか,どちらなのかよくわかりませんでした. 上記では,5秒たったら中心の点は消え,右隅だけに点が表示されます. ずっと表示させたいなら,if文の中にcvCircleを足せばいいと思います.

k-ryoji
質問者

お礼

返事が遅くなって申し訳ありません。 回答のほうありがとうございます。 デバックしてみると、エラーはでないのですが、カメラからの出力がなく、映像が映し出されなくなってしまいました。 やはりカメラを認識できていないということなのでしょうか? 質問の内容がおおざっぱすぎて申し訳ありません。 中心の点を5秒間表示したら消し、右の表示を5秒間表示したら消し、と繰り返して行うようなものを作りたいと考えています。

k-ryoji
質問者

補足

すいません、できました。 少し自分の入力ミスがありました。 本当にご協力ありがとうございました。

関連する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; }

  • マウスクリックしたポイントのHSV値の表示方法

    VC++のMFCにて顔画像処理について研究中の者です。 マウスクリックしたポイントのHSV値をそれぞれ3つのEditControlに表示させようと考えています。 RGB値をHSVに変換させる方法は、OpenCVのcvCvtColor()関数を使って    cvCvtColor( frameImage,hsvImage,CV_BGR2HSV ); という風に変換させようと思っています。 クリックした位置のHSV値の表示方法を教えてください。 よろしくお願いいたします。

  • 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の関数で 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()関数内にて 上記関数を使用したところこのような現象が起こりました. 分かる方がいらっしゃいましたら,ご回答よろしくお願いいたします.

  • OpenCVでのテンプレートマッチングについて

    質問させてください。 現在画像処理ライブラリのOpenCVを使ってテンプレートマッチングを用いた物体追跡しようと考えています。 今回作ってみたのですがどうしても、 「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」 というエラーが出てしまいます。 おそらく画像の読み込みの部分だとは思うのですが・・・・ よろしくお願いします。 ソースプログラムは次のようになってます。 int main( void ) { int device1 = 0; int key=0; double max_interlinkage=0; double min_interlinkage=0; CvPoint max_point; CvPoint min_point; CvPoint corner_point; char windowNameTemplate[] = "Template"; // テンプレート画像を表示するウィンドウの名前 char windowNameDestination[] = "Destination"; // マッチング結果を表示するウィンドウの名前 //videoInputオブジェクト videoInput VI; //利用可能なキャプチャデバイス数を取得 int numDevices = VI.listDevices(); //キャプチャデバイスが見つからなかったら終了 if(numDevices == 0) { cerr << "[Error] Capture device not found!!" << endl; exit(-1); } //デバイス初期化(今回はデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ) VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT); IplImage *templateImage = cvLoadImage( "C:/Documents and Settings/ito/My Document/My Pictures/temp.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ); IplImage *tempGray = cvCreateImage( cvGetSize(templateImage), IPL_DEPTH_8U, 1 ); if ( templateImage == NULL ) { // 画像が見つからなかった場合 printf( "画像が見つかりません\n" ); return -1; } cvCvtColor(templateImage,tempGray,CV_BGR2GRAY); IplImage *frameImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3 ); // 画像用IplImage IplImage *grayImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 1 ); // 元画像をグレースケール化した画像用IplImage IplImage *dstImage = cvCreateImage( cvSize( frameImage->width - templateImage->width + 1, frameImage->height - templateImage->height + 1 ), IPL_DEPTH_32F, 1 ); // 相違度マップ画像用IplImage memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(templateImage,tempGray,CV_BGR2GRAY); //ループ開始 while(1){ //カメラ・デバイスから画像取得 memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(frameImage,grayImage,CV_BGR2GRAY); // テンプレートマッチングを行う cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED ); // テンプレートが元画像のどの部分にあるのかという情報を得る cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL ); if(max_interlinkage>0.75){ corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height); printf("point x=%d ",max_point.x+templateImage->width); printf("point y=%d ",max_point.y+templateImage->height); cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT); printf("\n"); }else{ printf("point Lost\n"); } // ウィンドウを生成する cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE ); cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE ); // 画像を表示する cvShowImage( windowNameTemplate, templateImage ); cvShowImage( windowNameDestination , frameImage ); //キー入力 key = cvWaitKey(1); if(key=='q'){ break; }else if(key=='c'){ cvSaveImage("image/frame.bmp",frameImage); } }

  • opencvで画像上に丸を描画の方法

    opencv初心者です。 visualstudio2012 C++でopencvを動かすことはできているのですが、目的としてフルスクリーンに表示した画像の上に2点を丸でいいので表示したいのですが、画像しか表示されない、もしくは画像とは別のウィンドウで丸が表示される状態になっています。 // OpenCV2.4Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" //プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに // opencv2のあるフォルダ『C:\OpenCV\include』などを追加のこと #include "opencv2\opencv.hpp" #include <opencv2/core/core.hpp> #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts243d.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video243d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts243.lib") #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video243.lib") #endif //int _tmain(int argc, _TCHAR* argv[]) int gazouhyouzi(){ //画像データの読込 IplImage* src_img = cvLoadImage("C:\\opencv\\samples\\c\\fruits.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if (src_img == NULL){ std::exit(0); } //処理後画像データの確保 // IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels); //画像処理例(ガウシアンフィルタ) // cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9); //表示ウィンドウの作成 cvNamedWindow("src",0); //srcというwindowをフルスクリーンに設定 cvSetWindowProperty("src",CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN); //画像の表示 cvShowImage ("src", src_img); //キー入力待ち cvWaitKey (0); cv::Mat img = cv::Mat::zeros(500, 500, CV_8UC3); // 画像,円の中心座標,半径,色,線太さ,種類 cv::circle(img, cv::Point(100, 100), 20, cv::Scalar(200,0,0), -1, CV_AA); //画像データの解放 cvReleaseImage(&src_img); //全てのウィンドウの削除 cvDestroyAllWindows(); return 0; } とても見づらいとは思いますが間違っている部分の訂正をお願いしたく、投稿しました。 初心者なもので言葉の表現が間違っているかも知れませんが、よろしくおねがいします。 ちなみに上記のプログラムで実行すると、画像だけがフルスクリーンに表示されるだけです。

  • 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 プログラムについて

    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の動画書き込みのプログラムを作っているのですが・・・

    openCVの動画書き込みのプログラムを作っているのですが・・・ openCVで、読み込んだ動画(元動画)を背景差分法で2値化処理して出来た動画を保存する、というプログラムを作っています。 しかし、保存された動画を見ると、上手く書き込まれていません。というのも、元動画は15秒あるのですが、保存された動画を見ると、わずか2秒ほどで再生が終わってしまいます。 以下がプログラムのソースです。 #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #define THRESHOLD_MAX_VALUE 255 #define THRESHOLD 45 #define WIDTH 960 #define HEIGHT 540 int main( int argc, char **argv ){ int key; CvCapture *capture = NULL; IplImage *frameImage; IplImage *backgroundImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); IplImage *grayImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); IplImage *differenceImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); IplImage *binaryImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); double fps = 30.0; CvVideoWriter* VideoWriter = cvCreateVideoWriter("binary.avi", CV_FOURCC('F','L','V','1'), fps, cvSize(WIDTH, HEIGHT), 0 ); if ( ( capture = cvCreateFileCapture( "00011.avi" ) ) == NULL ) { printf( "File Not Found\n" ); return -1; } frameImage = cvLoadImage("haikei.bmp"); if(frameImage == NULL){ printf("Can't Get\n"); return -1; } cvCvtColor( frameImage, backgroundImage, CV_BGR2GRAY ); while ( 1 ) { frameImage = cvQueryFrame( capture ); if ( frameImage == NULL ){ break; } cvCvtColor( frameImage, grayImage, CV_BGR2GRAY ); cvAbsDiff( grayImage, backgroundImage, differenceImage ); cvThreshold( differenceImage, binaryImage, THRESHOLD, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY ); cvWriteFrame(VideoWriter, binaryImage); key = cvWaitKey( 10 ); if ( key == 'q' ) { break; } } cvReleaseCapture( &capture ); cvReleaseVideoWriter( &VideoWriter ); cvReleaseImage( &backgroundImage ); cvReleaseImage( &grayImage ); cvReleaseImage( &differenceImage ); cvReleaseImage( &binaryImage ); return 0; } 抽出している際に、プロンプト画面に Compiler did not align stack variables.~ と出てきます。 また、非圧縮などでやると再生が出来ません。 PC環境はWindowsXPです。 助けてください!!

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

専門家に質問してみよう