Размытие Rect в скриншоте - PullRequest
       91

Размытие Rect в скриншоте

6 голосов
/ 29 января 2020

Я разрабатываю приложение Android, которое использует фон Service, чтобы программно сделать снимок экрана с тем, что в данный момент находится на экране. Я получаю снимок экрана как Bitmap.

. Затем я успешно импортировал OpenCV в мой Android проект.

Что мне нужно Теперь нужно сделать размытым подмножество этого изображения, то есть не само изображение, а [прямоугольную] область или подобласть внутри изображения. У меня есть массив Rect объектов, представляющих прямоугольные angular области, которые мне нужно размыть на скриншоте.

Я искал учебник по этому с OpenCV в Java, и я не нашел четкого ответа. Классы Mat и Imgproc, очевидно, представляют интерес, и есть метод Mat.submat(), но я не смог найти четкое, простое руководство по выполнению этого.

Я много гуглил, и ни один из найденных примеров не является полным. Мне нужно сделать это в Java, во время выполнения Android.

Что мне нужно: Bitmap >>> Mat >>> Imgproc >>> Rect >>> Bitmap с размытым ROI.

Любой опытный разработчик OpenCV здесь, можете ли вы указать мне правильное направление? Это единственное, в чем я застрял.

Связано :

Размытие по Гауссу с помощью OpenCV: только размытие в субрегионе изображения? .

Как размыть прямоугольник с помощью OpenCv .

Как размыть некоторую часть изображения в Android? .

Ответы [ 2 ]

13 голосов
/ 03 февраля 2020

Код C ++ для выполнения этой задачи представлен ниже с комментариями и примерами изображений:

// load an input image
Mat img = imread("C:\\elon_tusk.png");

img :

enter image description here

// extract subimage
Rect roi(113, 87, 100, 50);
Mat subimg = img(roi);

subimg :

enter image description here

// blur the subimage
Mat blurred_subimage;
GaussianBlur(subimg, blurred_subimage, Size(0, 0), 5, 5);

blurred_subimage :

enter image description here

// copy the blurred subimage back to the original image
blurred_subimage.copyTo(img(roi));

img :

enter image description here

Android эквивалент:

Mat img = Imgcodecs.imread("elon_tusk.png");
Rect roi = new Rect(113, 87, 100, 50);
Mat subimage = img.submat(roi).clone();
Imgproc.GaussianBlur(subimg, subimg, new Size(0,0), 5, 5);
subimg.copyTo(img.submat(roi));
3 голосов
/ 01 февраля 2020

Вы можете просто реализовать свою собственную вспомогательную функцию, назовем ее roi (область интересов). Поскольку изображения в opencv - это numpy ndarrays, вы можете сделать что-то вроде этого:

def roi(image: np.ndarray, region: QRect) -> np.ndarray:
    a1 = region.upperLeft().x()
    b1 = region.bottomRight().y()
    a2 = region.upperLeft().x()
    b2 = region.bottomRight().y()
    return image[a1:a2, b1:b2]

И просто использовать эту вспомогательную функцию для извлечения интересующих вас областей изображения, размыть их и поместить результат вернуться к исходному изображению.

...