openFrameworksとOpenCVについてご質問のメールが来ていたので、それに対する解答です。
2つの画像をリアルタイムで合成するためにはどうしたらいいかということでした。まず、次のような画像があるとします。
ofxCvGrayscaleImage binaryImg
: どこに画像を当てはめるかを白黒の2値画像で表したもの
ofxCvColorImage sampleImg1
: binaryImgの白に当てはめる画像
ofxCvColorImage sampleImg2
: binaryImgの黒に当てはめる画像
ofxCvColorImage compositeImg
: 実際に二種類の画像を合成したもの
unsigned char * binaryImgPixels = binaryImg.getPixels(); unsigned char * sampleImg1Pixels = sampleImg1.getPixels(); unsigned char * sampleImg2Pixels = sampleImg2.getPixels(); int nPixels = camWidth*camHeight; unsigned char * compositeImgPixels = new unsigned char[nPixels*3]; for(int i=0; i<nPixels; i++){ if(binaryImgPixels[i]==255){ compositeImgPixels[3*i] = sampleImg1Pixels[3*i]; compositeImgPixels[3*i+1] = sampleImg1Pixels[3*i+1]; compositeImgPixels[3*i+2] = sampleImg1Pixels[3*i+2]; } else { compositeImgPixels[3*i] = sampleImg2Pixels[3*i]; compositeImgPixels[3*i+1] = sampleImg2Pixels[3*i+1]; compositeImgPixels[3*i+2] = sampleImg2Pixels[3*i+2]; } } compositeImg.setFromPixels(compositeImgPixels, camWidth, camHeight);
これでcompositeImgに二種類の画像が合成された画像ができます。
ここでfor文の中に3*i
, 3*i+1
, 3*i+2
というものがありますが、カラーの画像のピクセル情報は(R,G,B,R,G,B,…)という風に入っているので、i番目のピクセルに色をコピーしたい場合は3*i
(R)と3*i+1
(G)と3*i+2
(B)をすべてコピーしなくてはならないためこのようになっています。
実践例です。
次の動画は背景との差分をとって2値画像(binaryImg)とし、もとの画像をsampleImg1、少し変化させた背景画像をsampleImg2とし、合成しています。
前、掲載したColorTrackingの記事と組み合わせるには、colorTrackedPixelsRedがここでいうbinaryImgPixelsに対応します。
画像認識を使うといろいろ面白いことができるので、是非、やってみてはいかがでしょうか。
[…] 参考URL: openFrameworks + OpenCVで映像合成 – inter-arteq.com :: interaction between art and technology http://inter-arteq.com/blog/opencv/ […]
[…] セル情報を取ることもできるなど、ofVideoGrabberとほぼ同じように使えます。そうなれば、このあたりを参考にOpenCvと組み合わせたりすることでいろんな表現に落としこむことができそうで […]