OpenCVの部分処理(roi)について

はじめに

OpenCV の Roi についてまとめた。

とりあえずOpenCVを試してみたい方

実験用プログラム OpenCV_test の GitHubリポジトリ
URL
https://github.com/iryachi/OpenCV_test
実行ファイルだけ
https://github.com/iryachi/OpenCV_test/releases
使い方
https://iryachi.stars.ne.jp/opencv_test_imple/

Roi について

画像処理を行う時に、ある領域だけを取り出して処理したい時に Roi を使用する。
Region of Interest (興味領域, 関心領域)の略だけど、要するに処理したい範囲のこと。

Roiの書き方

Roi の書き方は数種類あるけど、中身は一緒。
roi_image に src_image から切り出したイメージを格納する場合。
例1
cv::Mat roi_image(src_image, cv::Rect(x, y, width, height));
例2
cv::Mat roi_image = cv::Mat(src_image, cv::Rect(x, y, width, height));
例3
cv::Mat roi_image = src_image(scv::Rect(x, y, width, height));

●注意点

上記のやり方は元画像(src_image) の切り出した部分を参照しているだけなので、roi_image を変更すると src_image に反映される。roi_image の変更を src_image に反映させたくない場合は、切り出した部分をコピーすればいい。

cv::Mat roi_copy = roi_image.clone();
もしくは
cv::Mat roi_copy;
roi_image.copyTo(roi_copy);

以下にコピーした場合としなかった場合の違いを示す。
 cv::blur(roi_image, roi_image, cv::Size(10, 10), cv::Point(-1, -1), 0); //コピーしない画像の処理
  cv::blur( roi_copy, roi_copy, cv::Size(10, 10), cv::Point(-1, -1), 0);   //コピーした画像の場合

終わりに

 Roi は複数人の顔を抜き出して処理する時や、重たい処理をする時の負荷を軽くするためによく用いる。

気をつけるのは参照なのか、コピーなのかというところ。Roi の画像に線を描画したりした時に元の絵にも描画されておかしくなったりする事がある。フィルター関係は同じインスタンスに出力する事が少ないからあまり気にならないけど。