catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

OpenCVでクロマキー

クロマキーとは

3Dになる以前のゲームなんかでよく使われていた、抜け色転送の機能を使ってみた。映像用語ではクロマキーとかなんとか。

たとえば、お天気キャスターが青色のスクリーン前で演技して天気図を重ね合わせるアレですね。

 

コード

    Mat src;
    if( (src = imread(filename,1)).data == 0 )
        return -1;

    // 入力画像と同じサイズをもつ出力画像を生成する
    Mat dstimg = src.clone();

    // マスク画像を作る
    Mat maskimg = src.clone();

    // 識別しやすいように、src,dst,mskの全画像の色を変えておく
    src.setTo(cv::Scalar(0,0,128) );
    dstimg.setTo(cv::Scalar(0,128,0) );
    maskimg.setTo(cv::Scalar(0,0,0) );

    imwrite("predst.jpg", dstimg); // 抜け色転送ができているか確認するためん、転送前の画像をとっておく。
// マスク画像を使って、画像を転送する(クロマキー) cv::putText(maskimg, "OpenCV", cv::Point(50,50), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar(255,255,255), 2, CV_AA); src.copyTo(dstimg, maskimg); imwrite("mask.jpg", maskimg); imwrite("dst.jpg", dstimg); imwrite("src.jpg", src);

 

コードの説明

srcに任意の画像を読み込んでくる

この画像をもとにマスク画像と転送先画像を作る。

結果を比較しやすいように、すべての画像を塗りつぶしておく。

 

cloneでマスク画像を作っている理由は、CopyToは同じ画像サイズ、同じビット深度という条件がついているから。

 

クロマキー機能は、CopyTo関数のマスクパラメータを使って実現する。

CopyTo関数の第二引数のMatクラス(ここではmaskimg)がマスクとして機能する。

マスクのMatクラスの行列要素の値が0以外の部分だけ転送される。

マスク画像は画像左上に"OpenCV"と白文字で記述しているため、この文字の部分だけ転送されることになる。他の部分は転送されずに残る。(つまりdstimgのままである。)

 

実行結果

転送元画像

f:id:Catalina1344:20140820215502j:plain

マスク画像

f:id:Catalina1344:20140820215500j:plain

転送前のdstimg

f:id:Catalina1344:20140820215730j:plain

転送後のdstimg

f:id:Catalina1344:20140820215503j:plain

 

こうしてみると、OpenCVと白文字でかかれた部分だけがsrcimgの赤っぽい色が転送されていることが分かる。

今回は簡単に実験するために文字だけで試してみたが、いわゆるお天気キャスターとか某ボカロの人とか転送すれば、色々と面白いことができるかもしれない。

クソコラつくるための基礎技術ですね。

さて、久しぶりの日記はこれくらいで。