OpenCVのベースのチュートリアル - 読み取りと書き込みのビデオ(コード+とスーパーディテール)

前の記事画像処理方法のための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;
}

 

发布了12 篇原创文章 · 获赞 27 · 访问量 784

おすすめ

転載: blog.csdn.net/Gary_ghw/article/details/102987775