Как сделать слайд-шоу с помощью OpenCV
Мы сделали слайд-шоу для большинства наших презентаций в колледже / офисе, чтобы они отлично смотрелись при презентации с использованием Microsoft PowerPoint, давайте рассмотрим это как действие по обработке изображений и посмотрим, как мы можем получить утилиту слайд-шоу с помощью библиотеки OpenCV Python в этой статье.
Необходимый импорт
Сначала создайте файл python, назовите его как хотите, скажем, для этой статьи slideshow.py
. Теперь добавьте в созданный файл следующие импортированные файлы:
# ./slideshow.py
import cv2
import numpy as np
from math import ceil
import os
- Мы импортируем
cv2
для всех задач обработки изображений,numpy
с псевдонимомnp
, чтобы создать начальное окно для отображения (все в OpenCV работает с NumPy под капотом),ceil
отmath
чтобы удовлетворить будущему условию ( в процессе создания приложения будут моменты, когда вам придется постоянно улучшать свою программу, и это нормально, но в этой статье я хочу сохранить все в одном месте с момента запуска, так что не беспокойтесь, просто знаем, что нам понадобится этот импорт), и, наконец, мы импортируемos
чтобы извлечь все файлы изображений, которые нам нужны в слайд-шоу.
Примечание. Вам также понадобится набор изображений, которые вы хотите просмотреть в виде слайд-шоу. Соберите их и храните в папке ./images
и не беспокойтесь о размере изображений.
Переменные, окно изображения и альфа-бета
Добавьте в тот же файл следующий код:
dst = "./images/" # Images destination
images = os.listdir(dst) # Get their names in a list
length = len(images)
result = np.zeros((360,360,3), np.uint8) # Image window of size (360, 360)
i = 1
a = 1.0 # alpha
b = 0.0 # beta
img = cv2.imread(dst + images[i])
img = cv2.resize(img, (360, 360))
- Первые 3 строки определяют имя изображения для всех изображений, находящихся в папке
./images
. Мы используем методos.listdir
для перечисления всего содержимого каталога, а затем сохраняем его в переменнойimages
, а также сохраняем длину в качестве меры для общего количества доступных изображений. - Затем мы создаем окно изображения определенного размера
(360, 360, 3)
, которое представляет собой трехканальное изображение. Изначально все будет черным (заполнено нулями). - Затем мы определяем еще несколько констант,
i
к которая будет использоваться для перебора изображений,a
чтобы сохранить начальное значение альфа иb
для начального значения бета, мы увидим, как они используются для перехода изображения, что в конечном итоге даст эффект слайд-шоу. - Наконец, мы берем первое изображение из списка изображений, изменяем его размер в соответствии с размером окна, это будет первое изображение, которое появится в слайд-шоу.
Цикл слайд-шоу
Создадим слайд-шоу, добавим в тот же файл следующий код:
# Slide Show Loop
while(True):
if(ceil(a)==0):
a = 1.0
b = 0.0
i = (i+1)%length # Getting new image from directory
img = cv2.imread(dst + images[i])
img = cv2.resize(img, (360, 360))
a -= 0.01
b += 0.01
# Image Transition from one to another
result = cv2.addWeighted(result, a, img, b, 0)
cv2.imshow("Slide Show", result)
key = cv2.waitKey(1) & 0xff
if key==ord('q'):
break
cv2.destroyAllWindows()
- Теперь мы создаем бесконечный цикл while. Внутри него есть условие, которое проверяет наличие
ceil(a)
, если оно достигает0
(нуля), затем мы сбрасываем значенияa
иb
, обновляемi
круговым способом, используя оператор модуля%
по длине списка изображений, чтобы получить индекс следующего изображения, и обновляем переменнуюimg
, чтобы содержать новое изображение и изменять его размер. - Вне условия мы используем
a
иb
для уменьшения и увеличения значений альфа и бета соответственно. Этот вариант даст нам эффект перехода, который кажется плавным. Мы будем использовать их с методомcv2.addWeighted
, который просто накладывает одно изображение на другое в зависимости от веса данных изображений. result
хранит новое обновленное изображение, которое мы будем отображать с помощью методаcv2.imshow
из OpenCV. Наконец, мы ждем ключевого события и выходим из цикла while, если оно произойдет, и уничтожаем все окна, созданные во время выполнения, с помощью методаcv2.destroyAllWindow
.
Метод cv2.addWeighted
- вот что помогает нам добиться желаемого эффекта слайд-шоу. Здесь значение альфа a
- это вес для результирующего изображения (которое изначально было черным окном), а значение бета b
- для нового изображения, которое будет перекрывать окно result
. Убедитесь, что сумма a
и b
остается равной 1
(единице). Для получения дополнительной информации посетите здесь.
Демо - Как это выглядит
Изображения, которые я сделал, являются логотипами моих любимых языков программирования - Python, Scala и ReactJS (в настоящее время изучаются).
Полный сценарий можно найти здесь.
Что дальше?
Ну вот и все. Если вы следите за этим, вы можете увидеть прекрасное слайд-шоу из своей коллекции изображений. Что касается следующих шагов, вы можете улучшить это приложение, добавив следующее:
- Добавьте кнопки для изменения типа слайд-шоу. В настоящее время выполняется только плавный переход, попробуйте реализовать другой анимированный переход.
- Добавьте утилиту для выбора нескольких изображений, а не всех, как мы это сделали, мы просто взяли каждое изображение. Кроме того, вы можете попытаться обработать исключение, например, что если из папки поступает не изображение.