首先我要说的是,我仍然是使用OpenCV的初学者。有些事情看起来很明显,一旦我了解它们,希望它们对我来说也很明显。
我的目标是使用floodFill
功能生成仅包含填充区域的单独图像。我已经研究了这个post,但是我对如何将填充的蒙版转换为填充颜色的实际BGRA图像感到有点迷茫。除此之外,我还需要裁剪新填充的图像以仅包含填充区域。我猜测OpenCV有一些神奇的功能可以解决问题。
这是我想要实现的目标:
原始图片:
填充图片:
仅填充区域:
更新日期07/07/13
能够使用以下代码填充单独的图像。但是,我仍然需要弄清楚只获得填充区域的最佳方法。此外,我的Floodfill解决方案在填充包含alpha值的图像时存在问题......
static int floodFillImage (cv::Mat &image, int premultiplied, int x, int y, int color)
{
cv::Mat out;
// un-multiply color
unmultiplyRGBA2BGRA(image);
// convert to no alpha
cv::cvtColor(image, out, CV_BGRA2BGR);
// create our mask
cv::Mat mask = cv::Mat::zeros(image.rows + 2, image.cols + 2, CV_8U);
// floodfill the mask
cv::floodFill(
out,
mask,
cv::Point(x,y),
255,
0,
cv::Scalar(),
cv::Scalar(),
+ (255 << 8) + cv::FLOODFILL_MASK_ONLY);
// set new image color
cv::Mat newImage(image.size(), image.type());
cv::Mat maskedImage(image.size(), image.type());
// set the solid color we will mask out of
newImage = cv::Scalar(ARGB_BLUE(color), ARGB_GREEN(color), ARGB_RED(color), ARGB_ALPHA(color));
// crop the 2 extra pixels w and h that were given before
cv::Mat maskROI = mask(cv::Rect(1,1,image.cols,image.rows));
// mask the solid color we want into new image
newImage.copyTo(maskedImage, maskROI);
// pre multiply the colors
premultiplyBGRA2RGBA(maskedImage, image);
return 0;
}
答案 0 :(得分:0)
你可以得到这两个图像的差异来获得不同的像素。
没有差异的像素将为零,其他像素为正值。
cv::Mat A, B, C;
A = getImageA();
B = getImageB();
C = A - B;
在这种情况下处理负值。(我认为不是你的情况)