C++版 OpenCVの基本

Matに画像を読み込む

imread関数を使います。2つ目の引数にはカラーで読み込むならIMREAD_UNCHANGEDを、グレースケールで読み込むならIMREAD_GRAYSCALEを指定します。IMREAD_GRAYSCALEを指定してカラー画像を読み込んだ場合は自動的にグレースケール化されます。WindowsとMacで画像ファイルへのパスの記述法が異なるので注意が必要です。

Mat img = imread("images¥¥sample.png", IMREAD_UNCHANGED); //Windowsの場合 パス中の¥は重ねて¥¥とする
Mat img = imread("images/sample.png", IMREAD_UNCHANGED); //Macの場合

 

動画を読み込む

VideoCaptureという型を持ったもの(下の例ではcap)を作成してそこに動画のある場所を覚えさせておき、必要な時にそこから画像を1枚ずつ取り出します。

Mat img;
VideoCapture cap("videos¥¥sample.mp4"); //Windowsの場合 パス中の¥は重ねて¥¥とする
VideoCapture cap("videos/sample.mp4"); //Macの場合
cap>>img ; //1フレーム分取り出してimgに保持させる

 

動画の情報の取得と設定
動画の縦横の大きさや長さ(何フレームあるか)を知りたい時にはgetを使います。下の例では縦の大きさ、横の大きさ、フレーム数、フレームレートを取得しています。また、動画を途中から再生することもできます。

int v_w=cap.get(CV_CAP_PROP_FRAME_WIDTH); //縦の大きさ
int v_h=cap.get(CV_CAP_PROP_FRAME_HEIGHT); //横の大きさ
int max_frame=cap.get(CV_CAP_PROP_FRAME_COUNT); //フレーム数
int fps=cap.get(CV_CAP_PROP_FPS); //フレームレート
cap.set(CV_CAP_PROP_POS_FRAMES,100); //100フレーム目から再生

 

画像の表示

imshow関数を使います。1つ目の引数にウィンドウの名前、2つ目の引数に表示したいMatの名前を指定します。下の例では動画を最後まで再生します。なお、表示した後にウィンドウが再描画されるための時間を空けなければなりません。そのためにwaitKey()関数で待つという処理を行います。この関数は1つの整数値の引数をとり、ms単位で待ちます。0を指定した場合には、ずっと待ち続けるという意味になるので注意が必要です。

#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace cv;
int main(){
    Mat img;
    VideoCapture cap("videos¥¥sample.mp4"); //Windowsの場合 パス中の¥は重ねて¥¥とする
    VideoCapture cap("videos/sample.mp4"); //Macの場合
    int max_frame=cap.get(CV_CAP_PROP_FRAME_COUNT); //フレーム数
    for(int i=0; i<max_frame;i++){ cap>>img ; //1フレーム分取り出してimgに保持させる
        imshow("Video",img);
        waitKey(1); // 表示のために1ms待つ
    }
    return 0;
}