
Размышляя над прикладной задачей «как прочитать мерцающую строку с номером электробуса» с помощью обычной камеры можно прийти к совершенно неожиданным результатам. Например, получить футуристические снимки окружающего ландшафта и вещей. Решение данной задачи с помощью python, а также несколько инопланетных изображений далее в статье.
Короткий ролик демонстрирует, как выглядит номер электробуса при съемке с помощью камеры raspberry pi:
ссылка на rutube
Заметно, что присутствует мерцание. Данный эффект не позволяет сделать качественный снимок, на котором будет присутствовать номер транспортного средства. На снимке ��удет либо видна часть номера, либо он вовсе будет отсутствовать. Как повезет.
Как прочитать номер для дальнейшего распознавания? Первое, что приходит на ум — это попытаться рассинхронизировать камеру с частотой обновления изображения на номерном знаке электробуса. Но что, если эта частота у каждого транспортного средства своя. Да и как это сделать на примере с picamera (предполагается использование одноплатника raspberry pi)?
Оказывается, есть еще один вариант решения задачи. Данный подход, как выяснилось, активно используется в астрономии при «фотографировании» звезд. Чтобы изображение звезды получилось качественнее, в некоторых случаях производится «сложение» снимков.
Продемонстрируем данный эффект на базе raspberry pi и python:
import time
import picamera
import cv2,os
import numpy as np
import glob
from datetime import datetime
frames = 3
def filenames():
frame = 0
while frame < frames:
yield 'photos/image%02d.jpg' % frame
frame += 1
with picamera.PiCamera(resolution='720p', framerate=30) as camera:
camera.start_preview(fullscreen=False, window = (100, 20, 640, 480))
#camera.vflip = True
camera.rotation = 270
# Give the camera some warm-up time
time.sleep(2)
start = time.time()
camera.capture_sequence(filenames(), use_video_port=True)
finish = time.time()
print('Captured %d frames at %.2ffps' % (
frames,
frames / (finish - start)))
os.chdir('photos/')
files=[]
for file in glob.glob('*.jpg'):
#print(file)
files.append(file)
x=0
def glue(img1,img2):
return cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
for f in range(len(files)-1):
img1 = cv2.imread(files[x])
img2 = cv2.imread(files[x+1])
dst = glue(img1,img2)
dst+=dst
x+=1
cv2.imwrite(f'{str(datetime.now()).split(" ")[1]}.png',dst)
#cv2.imshow('Blended Image',dst)
#cv2.waitKey(0)
#cv2.destroyAllWindows()
for file in glob.glob('image*.jpg'):
os.remove(file) Как несложно догадаться, основная «магия» происходит в функции glue, объединяющей снимки в нечто новое.

С помощью такого нехитрого подхода можно получать совершенно необычные снимки:

Но и в том числе решить прикладную задачу:

p.s. Возможно, классические методы cv не будут открытием для кого-то. Однако, об их (методах) существовании порой забываешь и начинаешь закапываться в дебри реализации.
