マスク処理で余分な場所を隠す

画像の一部分しか解析に必要ない、除外したいという場合にはマスク画像を用いてこれを実現できます。マスク画像を用意する場合、入力にはマスクしたい元々の画像と、どの部分をマスクしたいかを指定するマスク画像の2つを用意する必要があります。マスクという言葉の”隠す”という意味の通り、マスク画像でゼロの値を持つ場所はゼロ、すなわち、黒になります。マスク画像でゼロ以外の値をもつ(1でも構いません)pixel位置では、黒ではなく、元々の画像の値がコピーされます。下の図は、1つ目が元々の画像、2つ目がマスク画像、最後がマスクした結果の画像になります。

重要なのは次の部分です。

Mat result;
img.copyTo(result,mask);

元々の画像.copyTo(出力先, マスク画像); というように指定します。

input
mask
result
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace cv;
int main(){
    Mat img = Mat::ones(500, 500, CV_8UC1)*50;
    circle(img, cv::Point(200, 250), 100, Scalar(100), 30, 4);
    
    Mat mask = Mat::zeros(500, 500, CV_8UC1);
    circle(mask, cv::Point(300, 250), 100, Scalar(255), 30, 4);
    
    Mat result;
    img.copyTo(result,mask);
    
    imshow("img",img);
    imshow("mask",mask);
    imshow("result",result);
    
    waitKey(0);
    return 0;
}