Knihovna OpenCV Python umožnila automatizovat proces slučování více snímků do jednoho panoramatického snímku.

Panoramatická fotografie je technika zachycení širšího zorného pole, kterého nelze dosáhnout jedinou fotografií. Tato technika spojuje více snímků dohromady a vytváří jeden snímek, který zachycuje celou scénu pohlcujícím způsobem.

S pomocí Pythonu můžete tento proces automatizovat a snadno vytvářet krásná panoramata.

Nastavení prostředí Python

Chcete-li dokončit, měli byste mít a základní porozumění Pythonu. Spusťte jakékoli Python IDE a vytvořit nové virtuální prostředí. Vytvořte nový soubor Python. A na terminálu spusťte následující příkaz pro instalaci OpenCV.


pip install opencv-contrib-python

Budete používat opencv-contrib-python knihovny pro načítání obrázků a manipulaci s nimi. To má cv2.Sitcher třídy, kterou budete používat k vytváření panoramat.

Úplný zdrojový kód a ukázkové obrázky použité v tomto článku jsou k dispozici zde úložiště GitHub.

Import požadovaných knihoven

Importujte cv2 a os moduly do vašeho skriptu. K procházení systémovými cestami budete používat OS.

instagram viewer
import cv2
import os

The OS modul je vestavěný modul Pythonu. To je důvod, proč jej nemusíte instalovat externě.

Načítání obrázků

Vytvořte funkci pro načítání obrázků, které chcete sešít. Nejprve vytvořte prázdný seznam, do kterého budou uloženy počáteční obrázky. Poté procházejte každý soubor v cestě ke složce a zkontrolujte, zda se jedná o obrázek. Pokud se jedná o obrázek, načtěte jej a přidejte do seznamu obrázků.


defnačíst_obrázky(cesta_složky):
# Načtěte obrázky ze složky a změňte jejich velikost.
obrázky = []
pro název souboru v os.listdir (cesta_složky):
# Zkontrolujte, zda je soubor obrazovým souborem
-li název_souboru.endswith('.jpg') nebo název_souboru.endswith('.png'):
# Načtěte obrázek pomocí OpenCV a změňte jeho velikost
image = cv2.imread (os.path.join (cesta_složky, název souboru))
images.append (obrázek)
vrátit se snímky

Pro diverzifikaci programu můžete přidat více formátů obrazových souborů. Tento kód bude pouze hledat .jpg a .png formáty souborů.

Změna velikosti obrázků pro jednotný steh a rychlejší zpracování

Vytvořte funkci, která změní velikost seznamu obrázků. Funkce projde každý obrázek v seznamu a změní jeho velikost. Nakonec přidejte obrázky se změněnou velikostí do nového seznamu.


defzměnit velikost_obrázků(obrázky, šířka, výška):
resized_images = []
pro obraz v snímky:
resized_image = cv2.resize (obrázek, (šířka, výška))
resized_images.append (resized_images)
vrátit se resized_images

Změna velikosti zajišťuje, že spojování obrázků je jednotné. Zmenšuje také velikost souboru pro rychlejší zpracování.

Použití modulu Stitcher modulu OpenCV k sešívání obrázků

Vytvořte funkci pro spojení obrázků se změněnou velikostí. Tato technika je běžně známá jako vytváření panoramat. Funkce vezme jako vstup seznam obrázků. Použijte Sešívačka modul k jejich sešití. Nakonec funkce vrátí sešívaný obrázek a stavový kód.


defstitch_images(snímky):
stitcher = cv2.Stitcher.create()
(stav, stitched_image) = stitcher.stitch (images)
-li status == cv2.STITCHER_OK:
vrátit se stitched_image
jiný:
vrátit seŽádný

Pokud bylo šití úspěšné (jak je označeno cv2.STITCHER_OK stavový kód), funkce vrátí sešívaný obrázek. Jinak se to vrátí Žádný.

Oříznutí sešívaného obrázku

Vytvořte funkci, která provede sešitý obrázek a vrátí jej po oříznutí. Nejprve převeďte sešívaný obrázek na stupně šedi. Poté použijte binární práh a vytvořte binární obraz. Nakonec najděte největší obrys v binárním obrázku a vypočítejte jeho ohraničující obdélník.


defoříznout obrázek(obraz):
šedá = cv2.cvtColor (obrázek, cv2.COLOR_BGR2GRAY)
prahová hodnota = cv2.threshold (šedá, 0, 255, cv2.THRESH_BINARY)[1]
obrysy = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, š, v = cv2.boundingRect (obrysy[0])
cropped_image = obrázek[y: y + v, x: x + š]
vrátit se oříznutý_obrázek

Spojený obrázek se ořízne pomocí ohraničovacího obdélníku.

Náhled a uložení sešitého obrázku pomocí OpenCV

Vytvořte funkci, která zobrazí sešitý obrázek v interaktivním okně a uloží jej na disk.


defnáhled_a_uložení_obrázku(image, folder_path, folder_name):
# Zobrazte sešívaný obrázek
cv2.namedWindow('Sešitý obrázek', cv2.WINDOW_NORMAL)
cv2.imshow('Sešitý obrázek', obraz)
cv2.waitKey(0)

# Uložte sešívaný obrázek
output_filename = os.path.join (cesta_složky, název_složky + '_panorama.jpg')
cv2.imwrite (název výstupního_souboru, obrázek)
tisk('Sešitý obrázek uložen pro složku:', název složky)

Panoramatický snímek se uloží do stejné složky, která obsahuje původní snímky.

Řízení toku vašeho programu

Vytvořte funkci, která bude řídit tok vašeho programu. Načte všechny obrázky ze zadané složky. Změňte jejich velikost a spojte je dohromady. Ořízněte spojený obrázek, zobrazte jeho náhled a poté jej uložte na disk. Pokud jsou ve složce méně než dva snímky, funkce vytiskne chybové hlášení a vrátí se, aniž by se provedlo jakékoli sešívání nebo ukládání.


defstitch_folder(cesta_složky, šířka=800, výška=800):
# Spojte všechny obrázky do složky a uložte výsledek.
# Načtěte obrázky ze složky
obrázky = load_images (cesta ke složce)

# Zkontrolujte, zda jsou ve složce alespoň dva obrázky
-li len (obrázky) < 2:
tisk('Nedostatek obrázků ve složce:', cesta_složky)
vrátit se

# Změňte velikost obrázků
resized_images = resize_images (obrázky, šířka, výška)

# Spojte obrázky
stitched_image = stitch_images (obrázky se změněnou velikostí)
-li stitched_image jeŽádný:
tisk('Spojení se nezdařilo pro složku:', cesta_složky)
vrátit se

# Ořízněte sešívaný obrázek
cropped_image = crop_image (sešitý_obrázek)

# Náhled a uložení sešitého obrázku
název_složky = os.path.basename (cesta_složky)
preview_and_save_image (oříznutý_obrázek, cesta ke složce, název_složky)

Předejte cestu ke složce obsahující obrázky, které chcete sešít.

stitch_folder('sample_images') 

Obrázky, které používáte, by měly obsahovat překrývající se prvky. Těmito funkcemi může být cokoli od významných orientačních bodů až po vzory textur na obrázku. OpenCV je používá jako referenční bod pro zarovnání obrázků.

Bez těchto funkcí bude pro OpenCV obtížné zarovnat obrázky a vytvořit plynulé panorama.

Testování vašeho programu

Sbírejte snímky, které chcete přeměnit na panoramatický snímek. Ujistěte se, že mají překrývající se funkce.

Podívejte se na kopec na tomto prvním obrázku.

Na tomto druhém obrázku je kopec mírně viditelný. Tím se vytvoří překrývající se prvek.

Uložte obrázky do složky. Předejte cestu ke složce stitch_folder funkce pro šití. A pak spusťte program.

Program spojil snímky dohromady a vytvořil panoramatický snímek s širším pohledem na scénu. Všimněte si, že k vytvoření výše uvedeného panoramatického snímku bylo použito devět obrázků, které jsou přítomné ve výše uvedeném úložišti GitHub.

Manipulace s obrázky pomocí OpenCV

Vytváření panoramat ukazuje některé z mnoha technik manipulace s obrázky, které OpenCV nabízí. Existuje více technik, které můžete použít k manipulaci s obrázky tak, aby vyhovovaly vašim potřebám. Práce na více projektech zahrnujících manipulaci s obrázky vám pomůže zlepšit vaše schopnosti počítačového vidění obecně.