OpenCV VideoCaptureの使い方(ビデオファイル、カメラ、ネットワークビデオファイル)

1.ビデオ朗読

cv::VideoCapture はビデオ ファイルの読み取りをサポートするだけでなく、カメラからのビデオの読み取りもサポートします。cv::VideoCapture オブジェクトを作成するには 3 つの方法があります。
方法 1:
    cv::VideoCapture Capture(
    const string& filename, // input video file path name
    );

方法 2:
    cv::VideoCapture Capture(
    int device // input カメラ ビデオ キャプチャ デバイス ID
    );
カメラからビデオを読み取ります。この場合、アクセスしたいカメラを表す識別子とそのハンドシェイクを与えます。オペレーティングシステム。カメラの場合、この識別子は符号番号です。カメラが 1 台しかない場合は 0 (cv::CAP_ANY)、システム内に複数のカメラがある場合は値を増やしてください。

enum      cv::VideoCaptureAPIs {
  cv::CAP_ANY = 0,
  cv::CAP_VFW = 200,
  cv::CAP_V4L = 200,
  cv::CAP_V4L2 = CAP_V4L,
  cv::CAP_FIREWIRE = 300,
  cv::CAP_FIREWARE = CAP_FIREWIRE,
  cv::CAP_IEEE1394 = CAP_FIREWIRE,
  cv::CAP_DC1394 = CAP_FIREWIRE,
  cv::CAP_CMU1394 = CAP_FIREWIRE,
  cv::CAP_QT = 500,
  cv::CAP_UNICAP = 600,
  cv::CAP_DSHOW = 700,
  cv::CAP_PVAPI = 800,
  cv::CAP_OPENNI = 900,
  cv::CAP_OPENNI_ASUS = 910,
  cv::CAP_ANDROID = 1000,
  cv::CAP_XIAPI = 1100,
  cv::CAP_AVFOUNDATION = 1200,
  cv::CAP_GIGANETIX = 1300,
  cv::CAP_MSMF = 1400,
  cv::CAP_WINRT = 1410,
  cv::CAP_INTELPERC = 1500,
  cv::CAP_REALSENSE = 1500,
  cv::CAP_OPENNI2 = 1600,
  cv::CAP_OPENNI2_ASUS = 1610,
  cv::CAP_GPHOTO2 = 1700,
  cv::CAP_GSTREAMER = 1800,
  cv::CAP_FFMPEG = 1900,
  cv::CAP_IMAGES = 2000,
  cv::CAP_ARAVIS = 2100,
  cv::CAP_OPENCV_MJPEG = 2200,
  cv::CAP_INTEL_MFX = 2300,
  cv::CAP_XINE = 2400
}


例: cv::VideoCapture Capture(cv::CAP_IEEE1394 + 1); 2 番目 (番号は 0 から始まります) 1394 カメラを開こうとすることを示します。

方法 3: まずキャプチャ オブジェクトを作成し、メンバ関数 open() を使用してオープン情報を設定します。
    cv::VideoCapture キャプチャ;
    Capture.open( "my_video.avi" );

cv::VideoCapture のメンバー関数 isOpened() は true を返します (ビデオまたはカメラを開くときに、このメンバー関数を使用してオープニングが成功したかどうかを判断することをお勧めします)。

2.ビデオ朗読

ビデオ フレームを cv::Mat 行列に読み取るには 2 つの方法があります:
1 つは read() 操作
    cv::Mat Frame;
    cap.read(frame) で、 
もう 1 つは ">>" 操作です。
    cv::Mat フレーム;
    キャップ >> フレーム; 

3. カメラプロパティパラメータの設定と取得

 たとえば、プロパティ パラメーターを設定するには、bool VideoCapture::set(int propertyId, double value)、設定が成功した場合は true を返し、失敗した場合は false を返します。パラメータ: 1 つ目は属性 ID、2 つ目は属性に設定する値です。

 capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度 
 capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度
 capture.set(CV_CAP_PROP_FPS, 30);//帧率 帧/秒
 capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
 capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
 capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
 capture.set(CV_CAP_PROP_HUE, 50);//色调 50
 capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50
 capture.set(CV_CAP_PROP_FOURCC, 50);//FOURCC编解码器的4个字符代码。
 capture.set(CV_CAP_PROP_POS_AVI_RATIO,0);//视频文件的相对位置:0-胶片开始,1-胶片结束。
 capture.set(CV_CAP_PROP_CONVERT_RGB,1);//表示图像是否应转换为RGB的布尔标志
 capture.set(CV_CAP_PROP_RECTIFICATION,1);//立体摄像机的整流标志(注意:只有当前支持DC1394 v 2.x后端)

 たとえば、属性パラメータを取得するには、double VideoCapture::get(int propId),parameter:最初のパラメータは属性の ID です。クエリされたビデオ属性が VideoCapture クラスでサポートされていない場合は、0 が返されます。

 int nFrameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH);
 int nFrameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
 double fFrameRate = capture.get(CV_CAP_PROP_FPS);
 int nBrightness = capture.get(CV_CAP_PROP_BRIGHTNESS);
 int nContrast = capture.get(CV_CAP_PROP_CONTRAST);
 int nSaturation = capture.get(CV_CAP_PROP_SATURATION);
 int nHue = capture.get(CV_CAP_PROP_HUE);
 int nExposure = capture.get(CV_CAP_PROP_EXPOSURE);
 double fFrameCount = capture.get(CV_CAP_PROP_FRAME_COUNT);//总帧数
double fFramePos = capture.get(CV_CAP_PROP_POS_FRAMES);//视频帧号,0-based index of the frame to be decoded/captured next.
double fTimestamp = capture.get(CV_CAP_PROP_POS_MSEC);//时间戳(毫秒),position of the video file in milliseconds or video capture timestamp.
int ex = static_cast<int>(capture.get(CV_CAP_PROP_FOURCC));//获取FOURCC4个字符表示的视频编码器格式
// Transform from int to char via Bitwise operators
char EXT[] = {(char)(ex & 0XFF),(char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24),0};
如果是MPEG4编码,ex为0x7634706d,EXT为mp4v
如果是H264编码,ex为0x31637661,EXT为avc1
如果是H265编码,ex为0x31637662,EXT为avc2
CV_FOURCC获取编码格式:
cv.VideoWriter.fourcc(‘P’, ‘I’, ‘M’, ‘1’) 表示 MPEG-1 codec
cv.VideoWriter.fourcc(‘M’, ‘J’, ‘P’, ‘G’) 表示 motion-jpeg codec
cv.VideoWriter.fourcc(‘M’, ‘P’, ‘4’, ‘2’) 表示 MPEG-4.2 codec
cv.VideoWriter.fourcc(‘D’, ‘I’, ‘V’, ‘3’) 表示 MPEG-4.3 codec
cv.VideoWriter.fourcc(‘D’, ‘I’, ‘V’, ‘X’) 表示 MPEG-4 codec
cv.VideoWriter.fourcc(‘U’, ‘2’, ‘6’, ‘3’) 表示 H263 codec
cv.VideoWriter.fourcc(‘I’, ‘2’, ‘6’, ‘3’) 表示 H263I codec
cv.VideoWriter.fourcc(‘F’, ‘L’, ‘V’, ‘1’) 表示 FLV1 codec

4. ビデオフレームの読み出し位置を設定する

VideoCapture クラスの set メソッドを使用すると、ビデオの特定の位置でフレームを取り出すことができ、時間、フレーム番号、またはビデオの長さの比率に基づくいくつかのパラメータがあります。

double position=100.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);//帧号

double position=10000;
capture.set(CV_CAP_PROP_POS_MSEC,position);//时间戳位置(毫秒)

double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);//视频1/2位置

5. ビデオ ファイルまたはカメラの電源をオフにします。

VideoCapture::release()

6. 例

1. ローカルビデオファイルまたはネットワークビデオファイルを読み取ります。

#include<opencv2/opencv.hpp>
using namespace cv;
 
void main(){
    VideoCapture cap;
    cap.open("d:\\test.mp4");
    //cap.open("http://xxx/test.mp4");//http视频url地址
    if(!cap.isOpened())//如果视频不能正常打开则返回
        return;

    Mat frame;
    while(true)
    {
        cap>>frame;//等价于cap.read(frame);
        if(frame.empty())//如果某帧为空则退出循环
            break;

        imshow("video", frame);
        waitKey(25);//每帧延时25毫秒
    }
    cap.release();//释放资源
}

2. カメラビデオを読み取る

#include<opencv2/opencv.hpp>
using namespace cv;
 
void main(){
    //打开摄像机设备
    cv::VideoCapture cap= cv::VideoCapture(0);
    //先设置采集格式
    cap.set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
    //再设置高清采集分辨率
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
 
    if(!cap.isOpened())
        return;
 
    Mat frame;
    while(1)
    {
        cap>>frame;
        if(frame.empty())
            break;
        imshow("video", frame);
        if(waitKey(25)>0)//按下任意键退出摄像头
            break;
    }
    cap.release();
    destroyAllWindows();//关闭所有窗口
}

7. 注意すべき事項

1. OpenCV3 は OpenCV2 に似ており、ビデオの読み取りおよび書き込み操作は、cv::VideoCapture と cv::VideoWriter の 2 つのクラスを通じて実装されます。
2. opencv で「cv::VideoCapture」関数を使用すると、ローカル ファイルを読み取ることができず、エラー メッセージが表示されます: error: cv::CvCapture_Images::open CAP_IMAGES: Stop scan. Can または "Read video Failed"。解決策: opencv ビデオ デコードに依存する ffmpeg ライブラリを現在のディレクトリにコピーします。例: opencv_videoio_ffmpeg455_64.dll (455_64 は、opencv ライブラリのバージョンを示します)
OpenCV がビデオを処理する場合、.avi 形式のファイルのみを処理できます。.mp4 形式のファイルを開けません。.mp4 ファイルをサポートするには、opencv インストール パッケージの opencv_ffmpeg.dll または opencv_videoio_ffmpeg バージョン番号 xxx.dll ファイルを対応するプロジェクト フォルダーにコピーする必要があります。
3. 高解像度でカメラをオンにすると遅延が発生します。デフォルトでは、カメラは VideoCapture でオンになり、640x480 の小さな解像度をリアルタイムで表示できますが、1 秒近くの遅延が発生します。解像度が1920x1080の場合。
解決策 1:
バッファ サイズを設定できます。高解像度でもリアルタイムに表示できるように、プロパティ設定インターフェイスを使用してバッファサイズを削減します。

capture.set(CV_CAP_PROP_BUFFERSIZE,1);

解決策 2:
多くのカメラは、高解像度 YUV2 出力形式の場合、15 フレーム未満ですが、MJPG 出力形式でデコードすると 30 フレームに達する可能性があります。

//打开摄像机设备
cv::VideoCapture cap= cv::VideoCapture(0);
//先设置采集格式
cap.set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
//再设置高清采集分辨率
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

4. VideoCapture は、ネットワーク ビデオ ファイルを開くときに、http 形式と rtsp 形式のネットワーク ビデオ ファイルのみをサポートします。

おすすめ

転載: blog.csdn.net/byxdaz/article/details/130167899