Склейка фото как отдельный вид искусства (как распознать мерцающую строку)

infnlpduk8xpm4trhwizvpjbw44.png
Размышляя над прикладной задачей «как прочитать мерцающую строку с номером электробуса» с помощью обычной камеры можно прийти к совершенно неожиданным результатам. Например, получить футуристические снимки окружающего ландшафта и вещей. Решение данной задачи с помощью 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, объединяющей снимки в нечто новое.
-hn350mhqrots6bgyma9hzylpxi.png

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

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

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

Habrahabr.ru прочитано 1178 раз