クロマキーとは
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のままである。)
実行結果
転送元画像
マスク画像
転送前のdstimg
転送後のdstimg
こうしてみると、OpenCVと白文字でかかれた部分だけがsrcimgの赤っぽい色が転送されていることが分かる。
今回は簡単に実験するために文字だけで試してみたが、いわゆるお天気キャスターとか某ボカロの人とか転送すれば、色々と面白いことができるかもしれない。
クソコラつくるための基礎技術ですね。
さて、久しぶりの日記はこれくらいで。