Подтвердить что ты не робот

OpenCV - Floodfill на новый Mat

Учитывая точку на изображении, я хотел бы наполнить все точки, связанные с этой точкой, но на новое изображение. Наивный способ сделать это - это заполнить исходное изображение особым магическим значением цвета. Затем посетите каждый пиксель и скопируйте все пиксели с этим волшебным значением цвета на новое изображение. Должен быть лучший способ!

4b9b3361

Ответ 1

Почему бы вам не использовать второй вариант cv:: floodFill, чтобы создать маску?

int floodFill (InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect * rect = 0, Scalar loDiff = Scalar(), Scalar upDiff = Scalar(), int flags = 4)


  • Исходное изображение

    cv::Mat img = cv::imread("squares.png");

squares

  • Первый вариант

    cv::floodFill(img, cv::Point(150,150), cv::Scalar(255.0, 255.0, 255.0));

img Это img

  • Второй вариант

    cv::Mat mask = cv::Mat::zeros(img.rows + 2, img.cols + 2, CV_8U); cv::floodFill(img, mask, cv::Point(150,150), 255, 0, cv::Scalar(), cv::Scalar(), 4 + (255 << 8) + cv::FLOODFILL_MASK_ONLY);

mask Это mask. img не меняет


Если вы это сделаете, обратите внимание, что:

Поскольку маска больше заполненного изображения, пиксель (x, y) в изображении соответствует пикселю (x + 1, y + 1) в маске.