2

まず、私はまだ OpenCV を使用する初心者です。当たり前のように思えることもあるかもしれません。

私の目標は、floodFill機能を使用して、塗りつぶされた領域のみを含む別の画像を生成することです。この投稿を調べましたが、塗りつぶされたマスクを塗りつぶされた色の実際の BGRA 画像に変換する方法が少しわかりません。それに加えて、新しく塗りつぶされた画像をトリミングして、塗りつぶされた領域のみを含める必要もあります。OpenCVには、そのトリックを実行できる魔法の機能があると思います。

これが私が達成しようとしていることです:
元の画像:
ここに画像の説明を入力

塗りつぶされた画像:
ここに画像の説明を入力

塗りつぶし領域のみ:
ここに画像の説明を入力

UPDATE 07/07/13
次のコードを使用して、別の画像を塗りつぶすことができました。ただし、塗りつぶされた領域のみを取得するための最良の方法を見つける必要があります。また、私の塗りつぶしソリューションには、アルファ値を含む画像の塗りつぶしに問題があります...

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;
}
4

1 に答える 1