Найдите короля Сиконга

Python алгоритм компьютерное зрение OpenCV
Найдите короля Сиконга

IG выиграл чемпионат! Босс Ван в огне! Даже Босс Ван в восторге от возможности есть хот-доги, так что, конечно же, мы должны найти его в толпе!

Увидев работу студента-искусствоведа, как найти короля Сиконга за 3 секунды.


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

Даже студенты-художники высмеивают Ван Сиконга, как могут студенты-инженеры сидеть на месте! Затем я воспользуюсь работой и осуществлю автоматический поиск Ван Сиконга.

Поскольку я на работе, мне нужно использовать более профессиональный способ выполнения своей работы.

Цели проекта:Найдите любителя хот-догов Ван Сиконга в группе уток.

Реализация проекта: Python, OpenCV

Результат проекта: найдено за 0,3 секунды

Технический маршрут проекта:

  1. Получите Ван Сиконга размером с утку;
  2. Глобальный поиск в исходном изображении, чтобы найти местонахождение Ван Сиконга;
  3. Нарисуйте красную рамку вокруг Wang Sicong;
  4. Проверить скорость компьютера;

Конкретная реализация проекта:

Обработка изображений, как очень большая категория компьютерных алгоритмов, одна из готовых кодовых баз очень подходит для выполнения

1. Получите Wang Sicong того же размера, что и утка - измените размер (OpenCV)

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

Фотография Ван Сиконга была сделана той милой студенткой-искусствоведом.


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Nov  7 11:42:02 2018
@author: aaron
"""
import cv2

template = cv2.imread('wangsicong.png')
template = cv2.resize(template, (40, 40),
interpolation=cv2.INTER_CUBIC)
2. Глобальный поиск в исходном изображении и соответствие местоположению Wang Sicong - matchTemplate (opencv)

Как относительно универсальная библиотека обработки изображений, OpenCV может служить основой для обработки многих изображений.Например, функция обнаружения края может быть непосредственно использована для контроля границы изображения (OpenCV также предоставляет оператор canny, оператор sobel и т. д.).

Здесь мы используем алгоритм сопоставления с шаблоном (matchTemplate), который помогает алгоритму находить определенные объекты на изображении. Функция требует четыре параметра,

  • исходное изображение
  • Мониторинг обнаружения цели
  • график результатов матчей
  • метод сопоставления мер
  • CV_TM_SQDIFF, квадрат разницы
  • CV_TM_SQDIFF_NORMED, нормализация квадратичной разницы
  • CV_TM_CCORR, корреляция
  • CV_TM_CCORR_NORMED, нормализация корреляции
  • CV_TM_CCOEFF, коэффициент корреляции
  • CV_TM_CCOEFF_NORMED, нормализация коэффициента корреляции

Поэтому поиск в основном основан на совпадениях на уровне пикселей и не масштабируется;

Тон Ван Сиконга в нашей текущей задаче не изменился, так что разница в обоих методах не очень велика.

import numpy as np
from matplotlib import pyplot as plt
 
img = cv2.imread('image.jpg')
template = cv2.imread('detect.png')   

# Apply template Matching
res = cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))

# Get the size of template
w, h = template[:,:,0].shape[::-1]

3. Нарисуйте красную рамку вокруг Wang Sicong — minMaxLoc (OpenCV);

Результатом, полученным функцией matchTemplate, является карта значений оттенков серого, которая дает степень соответствия каждого диапазона обнаружения в изображении.Чем больше значение оттенков серого, тем выше сходство.

Чтобы нарисовать положение, в котором Sicong King, скорее всего, появится, мы используем функцию openCVv minMaxLoc, чтобы получить конкретное положение границы Sicong King, а затем используем функцию прямоугольника OpenCV для рисования прямоугольника.

# Get anchor for templateMatch result
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

# draw rectangle
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
imgplt = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.rectangle(imgplt,top_left, bottom_right, 255, 2)

# show image
plt.imshow(imgplt)
plt.title('Detected results'), plt.xticks([]), plt.yticks([])
plt.show()


Результат как указано выше! успех!

4. Скорость компьютера - timeit.

Модуль Python timeit может предоставить статистику времени работы кода, при использовании этого модуля записывается всего два времени. Один раз перед выполнением всего кода, один раз после выполнения всего кода — общее время выполнения кода для двух вычитаний.

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

import timeit
start = timeit.default_timer()

# All your code above

stop = timeit.default_timer()
print('Time: ', stop - start) 

Я запускал в среднем десять раз, и среднее время на MacBook Air 2018 года с базовой конфигурацией составило 0,2 секунды!

достичь цели!

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

  1. Во-первых, анализ показал, что цвет лица Ван Сиконга отличается от цвета уток, и его цвет лица уникален для него;
  2. Вы можете использовать функцию пипетки, чтобы получить RGB цвета лица Ван Сиконга;
  3. Найдите на изображении часть с цветом лица RGB и выделите ее;
  4. Найдите Ван Сиконга!

OpenCV — очень важная библиотека классов в области компьютерного зрения, она может поддерживать как традиционную обработку компьютерного зрения, так и компьютерное зрение с глубоким обучением. Его нижний уровень — C++, скорость работы очень высока, а также он предоставляет интерфейс вызовов Python, что действительно избавляет от многих проблем!

Спасибо за просмотр!