前の記事画像処理方法のためのOpenCVを説明するが、ビデオの現在の処理および分析がますますコンピュータビジョンの主流となりつつある、映像に含まれる情報の量は、画像よりもはるかに大きいが、本質的にはビデオフレームであります画像合成は、ビデオが最終的に処理するので、それは、画像処理にダウンしていますが、映像処理で、時間次元についての詳細を利用することができます。本論文では、ビデオの基本的な機能のいくつかに対処する上でOpenCVのを記述する
1、ビデオ読み取り(CV :: VIdeoCpature)
ビデオは、読ん主な利点のVideoCaptureのクラスのメソッドや操作の多くを持っていたビデオでビデオフレームを、オープン得る、唯一の最も一般的な使用方法は、本明細書で言及しました
目に見える具体的な:https://docs.opencv.org/3.1.0/d8/dfe/classcv_1_1VideoCapture.html
1.1コンストラクタは、ビデオファイルを取ります
//このコンストラクタ、正しいビデオファイルに入力されたファイルのパスでは、OpenCVのは、対応するビデオファイルを開きます。
CV :: VideoCapture :: VideoCapture(のconst文字列&ファイル名);
ビデオファイルを開くには二つの方法があります
//方法一
VideoCapture cap("E:/myFile/video/ty.mp4");//获取E:/myFile/video路径下的ty.mp4视频文件
//方法二
VideoCapture cap;
cap.open("E:/myFile/video/ty.mp4");//使用open方法
//このコンストラクタでは、カメラに対応する入力カメラIDは、デフォルトのカメラ0、開くことができ
CV :: VideoCapture :: VideoCapture(int型のデバイス)。
VideoCapture cap(0);//读取默认摄像头
1.2ビデオ読み出し成功するかどうかを確認します
ビデオファイルが正常にそれ以外の場合は、真をリードバックFalseの場合
if (!cap.isOpened())
{
cout << "无法打开视频文件!" << endl;
return -1;
}
1.3取得映像フレーム
ビデオフレームの取得方法の様々なものがあります
Mat frame;
//方法一
capture.read(frame);
//方法二
capture.grab();
capture.retrieve(frame);
//方法三
capture>>frame;
1.4ビデオ取得パラメータ
などのビデオパラメータ、がたくさんあります:フレームレート、フレームの合計数、サイズ、フォーマット、VideoCaptureのGETメソッドは、パラメータの多くを得ることができます
下に示すように、パラメータテーブル
パラメータ |
対応するマクロ | 説明 |
VideoCapture.get(0) | CV_CAP_PROP_POS_MSEC | ミリ秒単位でビデオファイル(遊び)の現在位置 |
VideoCapture.get(1) | CV_CAP_PROP_POS_FRAMES | 捕捉または復号する開始フレームインデックス0に基づいて |
VideoCapture.get(2) | CV_CAP_PROP_POS_AVI_RATIO | 0 =ムービーの最後を開始するには、1 =映画:ビデオファイルの相対位置(遊び) |
VideoCapture.get(3) | CV_CAP_PROP_FRAME_WIDTH | ビデオストリームのフレームの幅 |
VideoCapture.get(4) | CV_CAP_PROP_FRAME_HEIGHT | ビデオストリームのフレームの高さ |
VideoCapture.get(5) | CV_CAP_PROP_FPS | フレームレート/フレーム/ FPS |
VideoCapture.get(6) | CV_CAP_PROP_FOURCC | 4コーデック語 - 文字コード |
VideoCapture.get(7) | CV_CAP_PROP_FRAME_COUNT | ビデオファイルのフレーム数 |
VideoCapture.get(8) | CV_CAP_PROP_FORMAT | オブジェクト形式を返します。 |
VideoCapture.get(9) | CV_CAP_PROP_MODE | 現在の撮影モードを示す背面特定の値を返します |
VideoCapture.get(10) | CV_CAP_PROP_BRIGHTNESS | 画像の明るさ(カメラのみの場合) |
VideoCapture.get(11) | CV_CAP_PROP_CONTRAST | (カメラのみのための)画像のコントラスト |
VideoCapture.get(12) | CV_CAP_PROP_SATURATION | (カメラのみのための)画像の彩度 |
VideoCapture.get(13) | CV_CAP_PROP_HUE | トーン画像(カメラのみの場合) |
VideoCapture.get(14) | CV_CAP_PROP_GAIN | (カメラのみのための)画像ゲイン(ゲインはホワイトバランスは撮影を強化することを示しています) |
VideoCapture.get(15) | CV_CAP_PROP_EXPOSURE | 露出(カメラのみの場合) |
VideoCapture.get(16) | CV_CAP_PROP_CONVERT_RGB | これは、画像がRGBブールフラグに変換する必要があるかどうかを示します |
VideoCapture.get(17) | CV_CAP_PROP_WHITE_BALANCE | ×はサポートされていません。 |
VideoCapture.get(18) | CV_CAP_PROP_RECTIFICATION | 補正マークされたステレオカメラ(現在はDC1394 v.2.xバックエンドのサポートこの機能) |
一例を以下に示します
ビデオフレームの読取位置を設定する1.5
メソッドセットVideoCaptureクラスは、私たちは場所にビデオフレームを取り外すことができます
これは、ビデオの長さの比に応じも可能であるフレーム番号により、時間により、いくつかのパラメータを有します
//第100帧
double position=100.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);
//第1e6毫秒
double position=1e6;
capture.set(CV_CAP_PROP_POS_MSEC,position);
//视频1/2位置
double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);
この方法はまた、ビデオのフレームレートを設定すると同時に、輝度が設けられていてもよいです
2、映像書き込み(CV :: VIdeoWriter)
同様のビデオの書き込みとは、使用して、読みVideoWriterの、コンストラクタに加えて、このクラスのいくつかの方法があります実装するクラスを開いて、のIsOpen、書き込みがあり、オーバーロードされた演算子を提供します<<
CV :: VideoWriter(のconst文字列&パス、int型のFOURCC、ダブルFPS、サイズフレームサイズ、BOOL isColor =真)
- 最初のパラメータは保存されたファイルのパスとファイル名を表します
- 第2のパラメータは、符号化フォーマットを示し
- 3番目のパラメータは、フレームレートを示します
- 第四のパラメータは、ビデオのサイズを表します。
- 5番目のパラメータは、ビデオ画像(トゥルーカラー、偽階調)のタイプを示します
なお、FOURCC共通フォーマット
- CV_FOURCC( 'P'、 'I'、 'M'、 '1')= MPEG-1コーデック
- CV_FOURCC( 'M'、 'J'、 'P'、 'G')=モーションJPEGコーデック
- CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
- CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
- CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
- CV_FOURCC('U', '2', '6', '3') = H263 codec
- CV_FOURCC('I', '2', '6', '3') = H263I codec
- CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
3、视频读写程序示例
视频读取
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap("E:/myFile/video/ty.mp4");
Mat frame;
if (!cap.isOpened())
{
cout << "无法打开视频文件!" << endl;
return -1;
}
namedWindow("video", CV_WINDOW_AUTOSIZE);
while (cap.read(frame))
{
imshow("video", frame);
waitKey(10);
}
cap.release();
waitKey(0);
return 0;
}
视频写入
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
VideoCapture cap("E:/myFile/video/ty.mp4");
Mat frame, gray;
if (!cap.isOpened())
{
cout << "无法打开视频文件!" << endl;
return -1;
}
//获取视频帧的长和宽
Size size = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
VideoWriter writer("E:/myFile/video/ty_g.mp4", CV_FOURCC('M', 'J', 'P', 'G'), 24, size, true);
namedWindow("video", CV_WINDOW_AUTOSIZE);
while (cap.read(frame))
{
//imshow("video", frame);
//转换为黑白图像
cvtColor(frame, gray, COLOR_BGR2GRAY);
//二值化处理
threshold(gray, gray, 0, 255, THRESH_BINARY | THRESH_OTSU);
cvtColor(gray, gray, COLOR_GRAY2BGR);
imshow("video", gray);
writer.write(gray);
waitKey(10);
}
waitKey(0);
cap.release();
return 0;
}