У меня есть изображение png с зелеными и красными линиями и прозрачным фоном, которое мне нужно использовать в качестве маски для выполнения GrabCut. Но я получаю неожиданные результаты. Вот мой код:
//find the mask
Mat mask;
mask.create( image.size(), CV_8UC1);
mask.setTo(Scalar::all(GC_BGD));
Mat maskImg = imread("messi5.png");
for(int i=0; i<maskImg.cols; i++)
for(int j=0; j<maskImg.rows; j++)
{
//if it's red, make it white
if ((int)maskImg.at<cv::Vec3b>(j,i)[0]==0 && (int)maskImg.at<cv::Vec3b>(j,i)[1] == 0 && (int)maskImg.at<cv::Vec3b>(j,i)[2] == 255) {
mask.at<cv::Vec3b>(j,i)[0]= GC_BGD;
mask.at<cv::Vec3b>(j,i)[1] = GC_BGD;
mask.at<cv::Vec3b>(j,i)[2] = GC_BGD;
}
//if it's green, make it black
if ((int)maskImg.at<cv::Vec3b>(j,i)[0]==0 && (int)maskImg.at<cv::Vec3b>(j,i)[1] == 255 && (int)maskImg.at<cv::Vec3b>(j,i)[2] == 0) {
mask.at<cv::Vec3b>(j,i)[0] = GC_FGD;
mask.at<cv::Vec3b>(j,i)[1] = GC_FGD;
mask.at<cv::Vec3b>(j,i)[2] = GC_FGD;
}
}
...
Вот результат: http://prntscr.com/40kt4e. Я предполагаю, что прямоугольника нет, он видит только пиксели GC_FGD, все остальное считается BG. И выглядит как-то масштабно, но я понятия не имею, как это исправить.