OpenCV。 カメラからのビデオ。 ファイルに書き込む

画像
ご挨拶!

過去のレッスン:
OpenCV。 ビデオ出力
OpenCV(コンピュータービジョン)。 MSVS 2008でのインストール。「Hello World」

OpenCVのインストール方法を学び、最初のプログラムを作成し、ファイルからビデオを読み取りました。

次に、カメラからビデオをキャプチャするのがいかに簡単かを示し、ビデオをファイルに保存する方法を学びます。
行こう!


カメラからのビデオ。


最後のレッスンでは、ファイルからビデオを読み取る方法について説明しました。 ただし、OpenCVを使用して、既に録画されたビデオを処理することはほとんどありません。 このライブラリの幅広いアプリケーションは、リアルタイムビデオの処理にあります。

コードを見てみましょう:

#include "highgui.h"

int main( int argc, char** argv )
{
cvNamedWindow( "CAM Capture", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateCameraCapture(-1);
assert(capture != NULL);
IplImage* frame;
while(1)
{
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "CAM Capture", frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "CAM Capture" );
}


前のレッスンのコードと比較すると、違いはごくわずかです。
置き換えるcvCreateFileCapture()関数のみ
cvCreateCameraCapture() 、パラメーターとして、ファイルへのパスではなく、カメラIDに渡します-カメラが1台の場合は、値を-1に安全に設定します。
そして、ビデオファイルと同様に、すべてが起こります。

ファイルに書き込みます。


状況によっては、受信したビデオをファイルに書き込む必要があります(その処理後を含む)。 OpenCVライブラリを使用すると、これを行うことができます。 ビデオストリームからフレームを取得できるキャプチャデバイスを既に作成している場合、受信したフレームをビデオファイルに記録する記録デバイスを作成する必要があります。 これを行うには、 cvCreateVideoWriter()関数が必要です。
次に、フレームごとにcvWriteFrame()を使用する必要があり、結論としてcvReleaseVdeoWriter()を使用します。

#include "highgui.h"
#include "cv.h"

int main(int argc, char** argv[])
{
CvCapture* capture = cvCreateFileCapture("f.avi");

if( !capture )
{
return -1;
}

IplImage* bgr_frame = cvQueryFrame( capture );
double fps = cvGetCaptureProperty( capture, CV_CAP_PROP_FPS);
CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
CvVideoWriter* writer = cvCreateVideoWriter("1.avi", CV_FOURCC('M','J','P','G'), fps, size);
IplImage* logpolar_frame = cvCreateImage( size, IPL_DEPTH_8U, 3);

while( (bgr_frame=cvQueryFrame(capture)) != NULL )
{
cvLogPolar( bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),
40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
cvWriteFrame( writer, logpolar_frame );
}

cvReleaseVideoWriter( &writer );
cvReleaseImage( &logpolar_frame );
cvReleaseCapture( &capture );
return(0);
}


困難は生じないはずです。
このプログラムでは、小さな変換(対数極)を実行するか、単にビデオを白黒、より正確には-グレーの濃淡で配置します。 :)
出力ビデオの幅、高さ、およびfpsは、入力ビデオと同じになります。このため、次のラインを使用します。
double fps = cvGetCaptureProperty( capture, CV_CAP_PROP_FPS);
CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
CvVideoWriter* writer = cvCreateVideoWriter("1.avi", CV_FOURCC('M','J','P','G'), fps, size);


CV_FOURCC(「M」、「J」、「P」、「G」)-ここで、MJPGコーデック( motion jpeg )を定義します。

サイクル:

while( (bgr_frame=cvQueryFrame(capture)) != NULL )
{
cvLogPolar( bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),
40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
cvWriteFrame( writer, logpolar_frame );
}

変換を直接実行します。

後でcvLogPolar関数とそのすべてのパラメーターをさらに詳しく調べます。
これはもう1つのレッスンが終了しました。すべてのコメントと提案に喜んでいます。

Source: https://habr.com/ru/post/J78150/


All Articles