Размытие содержимого из прямоугольника с помощью Opencv - PullRequest
5 голосов
/ 30 сентября 2019

в следующей функции прямоугольника нарисованы прямоугольники.

// Draw the predicted bounding box
void drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat& frame)
{
    //Draw a rectangle displaying the bounding box
    rectangle(frame, Point(left, top), Point(right, bottom), Scalar(255, 178, 50),LINE_4);

    //bluring region
    cout << frame; 

    //Get the label for the class name and its confidence
    string label = format("%.2f", conf);
    if (!classes.empty())
    {
        CV_Assert(classId < (int)classes.size());
        label = classes[classId] + ":" + label;
    }

    //Display the label at the top of the bounding box
    int baseLine;
    Size labelSize = getTextSize(label, FONT_ITALIC, 0.5, 1, &baseLine);
    top = max(top, labelSize.height);
    putText(frame, label, Point(left, top), FONT_ITALIC, 0.5, Scalar(255, 255, 255), 1);
}

frame - это мульти-массив изображения. Точка (слева, сверху) - это верхняя левая точка прямоугольника.
Я хотел бы подвергнуть цензуре все в этом прямоугольнике в виде размытия. Поскольку я пришел из программирования на Python, определить массив этих прямоугольников немного сложно. Было бы очень хорошо, если бы вы могли мне помочь. Большое спасибо и наилучшие пожелания.

Ответы [ 2 ]

6 голосов
/ 30 сентября 2019

Способ заключается в настройке соответствующей области интереса (ROI) с помощью cv::Rect. Поскольку у вас уже есть верхнее левое и нижнее правое местоположения как cv::Points, вы получаете это более или менее бесплатно. После этого просто используйте - например - cv::GaussianBlur только для этого ROI. Используя C ++ API, этот подход работает для многих методов OpenCV.

Код довольно прост, см. Следующий фрагмент:

// (Just use your frame instead.)
cv::Mat image = cv::imread("path/to/your/image.png");

// Top left and bottom right cv::Points are already defined.
cv::Point topLeft = cv::Point(60, 40);
cv::Point bottomRight = cv::Point(340, 120);

// Set up proper region of interest (ROI) using a cv::Rect from the two cv::Points.
cv::Rect roi = cv::Rect(topLeft, bottomRight);

// Only blur image within ROI.
cv::GaussianBlur(image(roi), image(roi), cv::Size(51, 51), 0);

Для некоторых примерных входных данных, подобных этому

Input

приведенный выше код генерирует следующий вывод:

Output

Надеюсь, что поможет!

0 голосов
/ 01 октября 2019

Вот Python, эквивалентный ответу @ HansHirse. Идея та же, за исключением того, что мы используем нарезку Numpy для получения ROI

import cv2

# Read in image
image = cv2.imread('1.png')

# Create ROI coordinates
topLeft = (60, 40)
bottomRight = (340, 120)
x, y = topLeft[0], topLeft[1]
w, h = bottomRight[0] - topLeft[0], bottomRight[1] - topLeft[1]

# Grab ROI with Numpy slicing and blur
ROI = image[y:y+h, x:x+w]
blur = cv2.GaussianBlur(ROI, (51,51), 0) 

# Insert ROI back into image
image[y:y+h, x:x+w] = blur

cv2.imshow('blur', blur)
cv2.imshow('image', image)
cv2.waitKey()

image image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...