画像をある形状で切り抜きたいときなどにアルファマスキングと呼ばれる手法が使われます。OpenCVのmixChannelsを使ってこれを実現するためのメモです。
// 入力画像(3チャンネル)
cv::Mat src = cv::imread("input.jpg");
// マスク画像(グレースケール)
cv::Mat mask(300, 300, CV_8UC1);
// マスク領域を作成
cv::Point points[] = {
cv::Point(10, 100),
cv::Point(150, 20),
cv::Point(240, 200),
cv::Point(30, 280)
};
cv::fillConvexPoly(mask, points, 4, cv::Scalar(255), CV_AA);
// 出力画像(※先に領域の確保が必要)
cv::Mat dat(300, 300, CV_8UC4);
// 入力する画像の配列
cv::Mat srcArray[] = { cvSrc, mask };
// チャンネルの変換方法の指定
int from_to[] = { 0,0, 1,1, 2,2, 3,3 };
cv::mixChannels(srcArray, 2, &dst, 1, from_to, 4);
ふつうにcv::copyToなどでマスクを指定すると、マスク画像の黒でない領域を単純にコピーしてしまうのでジャギーが残ってしまうのですが、この方法でやればアンチエイリアスも保持されてきれいな画像になります。