• 締切済み

OpenCVによる動画の連続再生

現在OpenCVを用いて1秒間の動画のを連続再生しているのですが、時間経過とともに、処理が遅くなってしまいます。 //処理ループの開始 for(;;){ //AVIファイルからフレーム画像を取り出す if(NULL==(src_img=cvQueryFrame(capture))){         capture = cvCaptureFromAVI(filename);     src_img=cvQueryFrame(capture); } 上記で再生の繰り返し処理を行っているのですが、解決方法がわかりません。 この問題の解決方法がわかる方がおられましたら、よろしくお願いいたします。

みんなの回答

  • neoty
  • ベストアンサー率34% (37/107)
回答No.1

CvCapture *capture = cvCaptureFromAVI(filename); for(;;){ src_img=cvQueryFrame(capture); if(!src_img) break; } cvReleaseCapture(&capture); これでどうですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • OpenCVで携帯の動画をとりこみたいのですが、初心者のためやり方がわかりません。

    http://chihara.naist.jp/opencv/?%C6%B0%B2%E8%A5%D5%A5%A1%A5%A4%A5%E... 上記サイトのプログラムを参考にさせていただき、作ったのですが… OpenCV1.0とVisualStdio2008C++を使用しています。 aviファイルは携帯動画をMobile 3GP converterを用いて変換したものをC++のソースファイルが置いてあるところに置いています。 しかし、「指定のaviファイルが見つかりません」となってしまいます。 プログラムは以下の通りです #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <stdio.h> //読み込む動画ファイル名 char* filename="C:\\Users\\kimi\\Documents\\Visual Studio 2008\\Projects\\movie\\movie\\test.avi"; //IplImage IplImage* src; int main(){ CvCapture* capture = NULL; int key; //キー入力 //指定したAVIファイルが見つからない場合 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } //画像表示ウィンドウの準備 cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Source Image", 50, 50); //処理ループの開始 for(;;){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //画像表示 cvShowImage("Source Image", src); //キー入力 key = cvWaitKey(10); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseCapture(&capture); cvDestroyWindow("Source Image"); return 0; } aviファイルの置き場所が悪いのか、aviファイル自体に問題があるのかわかりません。 初心者のため、どうしたらaviファイルが認識されるかわからず困っています。 申し訳ないのですが、解決法をご指導ください。 よろしくお願いします。 補足

  • 【OpenCV】ハイビジョンaviファイル読み込み途中にファイルが終了してしまう問題

    現在、OpenCVを用いてハイビジョンのaviファイル(1440*1080)の画像処理を行うプログラミングを行っています。 aviファイルの読み込み・表示はOpenCVでは一般的な方法であるcvCaptureFromAVIとcvQueryFrameを用いて行っています。 この処理において最初の方はうまく処理が行えるのですが、処理が進むとファイルがまだ終わっていないのにも関わらず、cvQueryFrameでフレームが取得できず、処理が終了してしまいます。 ファイルが終了してしまうフレーム数も大体決まっており、mencoderで変換したファイルは約460フレーム目で、Adobe Media Encoderで変換したファイルは約910フレーム目でファイルが終了してしまいます。 メディアプレーヤーでaviファイルそのものを再生してみたところ、460フレーム目・910フレーム目以降のフレームも存在していることが確認されたので、本当にファイルが終了しているというわけではありません。 このままだと約30秒以上の動画は扱えず、非常に困っています。 確認として以下のプログラムで1000フレーム目から読み込むようにしてみたのですが、やはりすぐにファイルが終わってしまいます。 試しにハイビジョンでないaviファイル(640*480)で処理してみたところ正常に動作したのでエンコーダーの問題かプログラムの問題ではないかと思うのですが、何か少しでもお分かりの方がいらっしゃればご指導よろしくお願い致します。 <aviファイル読み込みプログラム> #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> char input_name[] = "hogehoge.avi"; int main(int argc, char** argv) { int key, i = 0; CvCapture* capture = NULL; IplImage* img = NULL; char* captureWindow = "Capture"; double prop; if(NULL==(capture = cvCaptureFromAVI(input_name))){ printf("指定のaviファイルが見つかりませんでした.\n"); return -1; } cvNamedWindow(captureWindow, CV_WINDOW_AUTOSIZE); prop = 1000.0f;       cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, prop); for(;;) { if(NULL==(img=cvQueryFrame(capture))){ printf("movieファイルが終わりました。\n"); break; } cvShowImage(captureWindow, img); printf("No.%dframe\n", i); i++; key = cvWaitKey(1); if (key == 0x1b) { break; } } cvReleaseCapture(&capture); cvReleaseImage(&img); cvDestroyWindow(captureWindow); return 0; }

  • OpenCVで動画の指定したフレームをキャプチャ

    現在,動画像処理を勉強している者です. OpenCV 2.3.1を使って動画像から任意のフレームを切り出し,Bitmapに格納する方法がわからなくて困っています. cvWaitKeyを使ってプログラムをスリープさせながら,繰返しすれば動画っぽく表示することはできるのですが,「40フレーム目から処理したい」といったことをするためにはどうすればいいのでしょうか. 以下のコードでプロパティをいじって動画の真ん中のフレームを切り出すつもりだったのですが,無理でした... cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, frame_count / 2.0); この後にIplImage型の変数にcvQueryFrame(capture)を突っ込んでもnullでした...なぜ... ※なお,capture←動画ファイル frame_count←総フレーム数がそれぞれ格納されています.

  • 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; } 以上です。 よろしくおねがいします。

  • OpenCVでのavi動画ファイルの指定

     現在Visual Studio 2005とOpenCVを用いて、avi動画を表示させようとしているのですが、ファイルを指定しても無いものと判断され出力できない状況です。同じような質問があったのですが、結局コマンドプロンプトの移動というのがよくわからなかったため分かる方がいたら教えていただきたいです。  avi動画ファイルはC:\\Documents and Settings\\user\\デスクトップ\\a.aviにあり、以下のプロジェクトファイルはC:\Documents and Settings\user\My Documents\Visual Studio 2005\Projects\cv\cvにあります。 //--------------------------------------------------------- // 概要 : 動画(aviファイル)読み込み // File Name : LoadVideo.cpp // Library : OpenCV for MS-Windows beta5 // Auther : Yasuhiro Yoshimura // Date : Dec 26, 2005; 22:22 //--------------------------------------------------------- #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <stdio.h> //読み込む動画ファイル名 char* filename="C:\\Documents and Settings\\user\\デスクトップ\\a.avi"; //IplImage IplImage* src; int main(){ CvCapture* capture = NULL; int key; //キー入力 //指定したAVIファイルが見つからない場合 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } //画像表示ウィンドウの準備 cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Source Image", 50, 50); //処理ループの開始 for(;;){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //画像表示 cvShowImage("Source Image", src); //キー入力 key = cvWaitKey(10); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseCapture(&capture); cvDestroyWindow("Source Image"); return 0; } よろしくお願いします。

  • OpenCVでの動画処理(入出力)

     OpenCVを用いて動画処理を行っています。  動作環境はMacOS10.9で、MacPortsを用いて最新版(おそらく...)のOpenCVを入れています。開発環境はXCode4です。  USBカメラを接続し、cvQueryFrame(CvCapture*)の関数を用いて画像を取得しています。そのままこの関数の返り値をIplImage*に代入してはいけないようなことをどこかで聞いていたので、念のため... IplImage* cap = cvQueryFrame(capture); IplImage* img; if(cap) img = cvCloneImage(cap); else img = NULL; というようなコードを書いて、imgに対して処理を行っています。  しかし、頻度は少ないのですがたまにimgにNULLが代入されるときが有ります。頻度は5000フレームに一度あるかどうかで、再現性が低いのでなんだかよくわかりません。 これは仕様なのでしょうか?USBカメラがたまに画像を取得できない瞬間があるという理解でいいのでしょうか?  私のコードに間違いがある場合は指導お願いします。  あと、動作が正常なので、画像は取得できているのでしょうが... QTCaptureSession warning: Session received the following error while decompressing video: Error Domain=NSOSStatusErrorDomain Code=-12909 "The operation couldn’t be completed. (OSStatus error -12909.)". Make sure that the formats of all video outputs are properly configured. というような警告が標準出力される時があります。 この警告の頻度はなかなか多く、200フレームに一度ぐらいあります。 動作は正常ですが、この瞬間だけ処理速度が少し落ちる傾向があるようです。 ちなみに言語はC++を用いています。 よろしくお願いします。

  • 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での2枚の画像の差分のやり方

    opencvのc言語で2枚の画像の差分をとりたいのですが,最後の差分をとるところでエラーが出てしまいます. char *filename = "動画の名前.avi"; CvCapture* cap = cvCaptureFromAVI(filename);//filename:const char*型のファイル名 filenameの動画像を読み込む double framecount = (int)cvGetCaptureProperty(cap, CV_CAP_PROP_FRAME_COUNT);//フレーム数を数える IplImage *srcCur=NULL; IplImage *srcOld=NULL; cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, 1); srcOld = cvQueryFrame(cap);//1フレーム目の画像を読み込む cvSetCaptureProperty(cap, CV_CAP_PROP_POS_FRAMES, 2); srcCur = cvQueryFrame(cap);//2フレーム目の画像を読み込む cvAbsDiff(srcOld2,srcCur2,dst);←ここでエラーがでます。 エラー内容は多分,差分するためには,同じ画像サイズ同士で 同じ型どうしでないといけないと書かれていますが, 同じ動画から読み込まれているので,違うことはありえないと思います. どうしたらいいですか?

  • visual studio 2010

    次のデータでUntitled 3.aviが読み込まれないんですけど、どうしてでしょうか??? これはネットからコピペしたデータの動画データだけ変更したやつなんですけど・・・ //--------------------------------------------------------- // 概要 : 動画(aviファイル)読み込み // File Name : LoadVideo.cpp // Library : OpenCV for MS-Windows beta5 // Auther : Yasuhiro Yoshimura // Date : Dec 26, 2005; 22:22 //--------------------------------------------------------- #include <cv.h> #include <cxcore.h> #include <highgui.h> #include <stdio.h> //読み込む動画ファイル名 char* filename="Untitled 3.avi"; //IplImage IplImage* src; int main(){ CvCapture* capture = NULL; int key; //キー入力 //指定したAVIファイルが見つからない場合 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } //画像表示ウィンドウの準備 cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Source Image", 50, 50); //処理ループの開始 for(;;){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //画像表示 cvShowImage("Source Image", src); //キー入力 key = cvWaitKey(10); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseCapture(&capture); cvDestroyWindow("Source Image"); 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; } ---------------------------------

ウイルスバスターの解約方法
このQ&Aのポイント
  • ウイルスバスターの解約方法について解説します。
  • ウイルスバスターの解約手続きや注意点についてまとめました。
  • ウイルスバスターの解約に関する情報を詳しく説明します。
回答を見る