OpenCV (51) --- Мозаика всего зла

OpenCV
OpenCV (51) --- Мозаика всего зла

Принцип мозаичного алгоритма

В обычной жизни мы часто видим различные мозаики, такие как видеомозаики на некоторых жестких дисках отаку и некоторые живые видеомозаики аватаров подозреваемых в совершении преступлений. Можно сказать, что в жизни мозаика повсюду.

Поэтому, пока мы изучаем OpenCV, мы также должны уметь применять мозаику. Далее давайте разберемся с несколькими принципами реализации алгоритма мозаики:

  1. Назначьте всем частям изображения, которым нужна мозаика, первое значение пикселя в верхнем левом углу области.
  2. Случайным образом перемешайте пиксели частей изображения, которые должны быть мозаичными.
  3. Случайным образом замените все значения пикселей в нужной области мозаики на точку.

Эта статья подробно расскажет об операции обработки мозаики.

Реализовать мозаику на картинке

Здесь мы используем принцип 3-реализации, случайным образом заменяя все значения пикселей в нужной области мозаики определенной точкой. Конкретный код выглядит следующим образом:

#马赛克操作
def mosaic_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    size = 10#马赛克大小
    for i in range(size, h - 1 - size, size):
        for j in range(size, w - 1 - size, size):
            i_rand = random.randint(i - size, i)
            j_rand = random.randint(j - size, j)
            new_img[i - size:i + size, j - size:j + size] = img[i_rand, j_rand, :]
    return new_img


if __name__ == "__main__":
    img = cv2.imread("49.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", mosaic_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()

Можно видеть, что размер мозаики, установленный в нашем коде, равен 10. В этой области пиксель выбирается случайным образом, и все пиксели устанавливаются в случайно выбранное значение пикселя, таким образом достигается цель мозаики. А для исходного изображения контур по-прежнему выглядит без изменений. Эффект следующий:

马赛克效果

Отслеживайте лица видео и блокируйте их с помощью мозаики

Кажется немного простым реализовать мозаику непосредственно на картинке, мы могли бы также объединить знания о камере захвата и знания о распознавании лиц из предыдущей статьи, чтобы использовать мозаику в видео. Без лишних слов перейдем непосредственно к коду:

# 将视频中的人脸替换成马赛克
def mosaic_video_effect(img):
    height, width, n = img.shape
    new_img = img.copy()
    size = 20
    faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.15, minNeighbors=2, minSize=(5, 5))
    for (x, y, w, h) in faces:
        for i in range(x + size, (x + w) - 1 - size, size):
            for j in range(y + size, (y + h) - 1 - size, size):
                if i - size > 0 and j + size < width and i + size < height and j - size > 0:
                    i_rand = random.randint(i - size, i)
                    j_rand = random.randint(j - size, j)
                    new_img[i - size:i + size, j - size:j + size] = img[i_rand, j_rand, :]
                else:
                    new_img[x:x + w, y:y + h] = [255, 255, 255]
    return new_img


if __name__ == "__main__":
    cap = cv2.VideoCapture(0)
    while (cap.isOpened()):
        ret, frame = cap.read()
        frame = mosaic_video_effect(frame)
        cv2.imshow('video', frame)
        c = cv2.waitKey(1)
        if c == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

Здесь следует отметить, что поскольку мы только частично закрываем лицо, это не полноэкранная мозаика, и когда лицо перемещается к краю камеры, i - размер, j - размер может быть меньше 0, j + size, i + size Может быть больше, чем ширина и высота, что приведет к ошибке выхода за границы массива. Поэтому, чтобы избежать назначения за пределами поля, когда лицо находится на краю, мы считаем, что белая мозаика может быть заблокирована непосредственно на краю.

视频马赛克