なにメモ

コンピュータビジョンや機械学習関係の話題を書き綴ると思うブログです。

【移植した過去記事】OpenCV 2.2での画像の貼り付けとアルファチャネルへの対応

注意:OpenCV 2.3.1以降、pngのアルファチャンネルの読み込みに対応したそうなので、そちらで対応してください。

 

OpenCV 2.2での画像の貼り付けは以下のとおり

 

OpenCV: paste a image

実はチートシートにもほぼ同じ内容が書いてあったりする。(行列操作の例3参照)
http://opencv.jp/opencv-2.2/opencv_cheatsheet.pdf

ソースの内容は

1.貼りつけたい領域をRectクラスで指定するため作成する。startColumn,startRowは貼り付ける場所の左上の部分に相当する。
2.Rectクラスを使い、dstから部分行列subdstを切り出す。
3.そのsubdstに画像のデータをコピーしている。

ちなみに、subdstで行った変更はもとの行列dstにも反映される。(というかたぶん同じメモリ領域だから)
この着目する部分行列をROI(Region Of Interest;関心領域)というらしい。
画像の一部に処理する場合は、このようにRectクラスで切り出したあと、操作を行えばいいらしい。
なんかクリップ領域やマスキングに似ている。



残念ながら、仕様によると現時点(ver. 2.2)ではアルファチャネル(透過色の情報)の読み込みには対応していない。
透過色を使いたいときは、

1.マスク画像を用いて、切り抜きたいところを透明にする。
貼り付ける画像と同じサイズの二値画像を用意する。
この二値画像は貼り付ける画像と座標を対応付けて、切り抜きたいところを黒、そのままにしたいところを白にしておく。
サンプルはこんな感じ。

f:id:alfredplpl:20131016225824p:plain

gist7007971

 

2.透過する部分を別にして貼り付ける。
透過する部分の画像を予め別の画像trans.pngとしておく。
trans.pngにアルファチャネルが含まれていても破棄されることに注意する。
trans.pngをconvertToで透過率を指定して貼り、その他の部分を貼り付ける。

gist7007944

の2つの方法が考えられる。