Knižnica OpenCV Python umožnila automatizovať proces spájania viacerých obrázkov do jedného panoramatického obrázka.

Panoramatická fotografia je technika zachytenia širšieho zorného poľa, ktoré jediná fotografia nedokáže dosiahnuť. Táto technika spája viacero obrázkov dohromady a vytvára jeden obrázok, ktorý zachytáva celú scénu pohlcujúcim spôsobom.

S pomocou Pythonu môžete tento proces automatizovať a ľahko vytvárať nádherné panorámy.

Nastavenie prostredia Pythonu

Ak chcete pokračovať, mali by ste mať a základné pochopenie Pythonu. Spustite akékoľvek Python IDE a vytvoriť nové virtuálne prostredie. Vytvorte nový súbor Python. A na termináli spustite nasledujúci príkaz na inštaláciu OpenCV.


pip nainštalovať opencv-contrib-python

Budete používať opencv-contrib-python knižnicu na načítanie obrázkov a manipuláciu s nimi. To má cv2.Stitcher triedy, ktorú použijete na vytváranie panorám.

Úplný zdrojový kód a vzorové obrázky použité v tomto článku sú k dispozícii v tomto článku úložisko GitHub.

Import požadovaných knižníc

instagram viewer

Importovať cv2 a os modulov do vášho skriptu. Na navigáciu po systémových cestách budete používať OS.

importovať cv2
importovať os

The modul OS je vstavaný modul Pythonu. To je dôvod, prečo ho nemusíte inštalovať externe.

Načítavanie obrázkov

Vytvorte funkciu na načítanie obrázkov, ktoré chcete spojiť. Najprv vytvorte prázdny zoznam, v ktorom budú uložené počiatočné obrázky. Potom prejdite každý súbor v ceste k priečinku a skontrolujte, či je súbor obrázkom. Ak ide o obrázok, načítajte ho a pridajte do zoznamu obrázkov.


defnačítať_obrázky(cesta k priečinku):
# Načítajte obrázky z priečinka a zmeňte ich veľkosť.
obrázky = []
pre názov súboru v os.listdir (cesta k priečinku):
# Skontrolujte, či je súbor obrazovým súborom
ak názov_súboru.endswith(.jpg) alebo názov_súboru.endswith('.png'):
# Načítajte obrázok pomocou OpenCV a zmeňte jeho veľkosť
image = cv2.imread (os.path.join (cesta k priečinku, názov súboru))
images.append (obrázok)
vrátiť snímky

Na spestrenie programu môžete pridať viac formátov obrázkových súborov. Tento kód bude hľadať iba .jpg a .png formáty súborov.

Zmena veľkosti obrázkov pre jednotný steh a rýchlejšie spracovanie

Vytvorte funkciu, ktorá zmení veľkosť zoznamu obrázkov. Funkcia prejde každý obrázok v zozname a zmení jeho veľkosť. Nakoniec pridajte obrázky so zmenenou veľkosťou do nového zoznamu.


defzmeniť veľkosť_obrázkov(obrázky, šírka, výška):
resized_images = []
pre obrázok v snímky:
resized_image = cv2.resize (obrázok, (šírka, výška))
resized_images.append (zmenený_obrázok)
vrátiť resized_images

Zmena veľkosti zaisťuje, že spojovanie obrázkov je jednotné. Znižuje tiež veľkosť súboru pre rýchlejšie spracovanie.

Použitie zošívacieho modulu OpenCV na zošívanie obrázkov

Vytvorte funkciu na spojenie obrázkov so zmenenou veľkosťou. Táto technika je bežne známa ako vytváranie panorámy. Funkcia použije ako vstup zoznam obrázkov. Použi Zošívačka modul na ich spojenie. Nakoniec funkcia vráti zošitý obrázok a stavový kód.


defstitch_images(snímky):
stitcher = cv2.Stitcher.create()
(stav, stitched_image) = stitcher.stitch (images)
ak status == cv2.STITCHER_OK:
vrátiť stitched_image
inak:
vrátiťžiadne

Ak bolo šitie úspešné (ako je označené symbolom cv2.STITCHER_OK stavový kód), funkcia vráti zošitý obrázok. V opačnom prípade sa to vráti žiadne.

Orezanie zošitého obrázka

Vytvorte funkciu, ktorá prevezme zošitý obrázok a po orezaní ho vráti. Najprv preveďte zošitý obrázok na odtiene sivej. Potom použite binárny prah na vytvorenie binárneho obrazu. Nakoniec nájdite najväčší obrys v binárnom obrázku a vypočítajte jeho ohraničujúci obdĺžnik.


defcrop_image(obrázok):
šedá = cv2.cvtColor (obrázok, cv2.COLOR_BGR2GRAY)
prah = cv2.threshold (sivá, 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])
orezaný_obrázok = obrázok[y: y + v, x: x + š]
vrátiť orezaný_obrázok

Zošitý obrázok sa oreže pomocou ohraničovacieho obdĺžnika.

Zobrazenie ukážky a uloženie zošitého obrázka pomocou OpenCV

Vytvorte funkciu, ktorá zobrazí zošitý obrázok v interaktívnom okne a uloží ho na disk.


defpreview_and_save_image(obrázok, cesta k priečinku, názov priečinka):
# Zobrazte zošitý obrázok
cv2.namedWindow('Spojený obrázok', cv2.WINDOW_NORMAL)
cv2.imshow('Spojený obrázok', obrázok)
cv2.waitKey(0)

# Uložte zošitý obrázok
názov_výstupného_súboru = os.path.join (cesta_priečinku, názov_priečinku + '_panorama.jpg')
cv2.imwrite (názov výstupného_súboru, obrázok)
vytlačiť ('Spojený obrázok uložený pre priečinok:', folder_name)

Panoráma sa uloží do rovnakého priečinka, ktorý obsahuje pôvodné snímky.

Ovládanie toku vášho programu

Vytvorte funkciu, ktorá bude riadiť tok vášho programu. Načíta všetky obrázky zo zadaného priečinka. Zmeňte ich veľkosť a spojte ich dohromady. Zošitý obrázok orežte, zobrazte jeho náhľad a potom ho uložte na disk. Ak sú v priečinku menej ako dva obrázky, funkcia vytlačí chybové hlásenie a vráti sa bez vykonania akéhokoľvek spájania alebo uloženia.


defstitch_folder(cesta k priečinku, šírka=800, výška=800):
# Spojte všetky obrázky do priečinka a uložte výsledok.
# Načítajte obrázky z priečinka
obrázky = načítať_obrázky (cesta k priečinku)

# Skontrolujte, či sú v priečinku aspoň dva obrázky
ak len (obrázky) < 2:
vytlačiť ('Nedostatok obrázkov v priečinku:', cesta k priečinku)
vrátiť

# Zmeňte veľkosť obrázkov
resized_images = resize_images (obrázky, šírka, výška)

# Spojte obrázky
stitched_image = stitch_images (obrázky so zmenenou veľkosťou)
ak stitched_image ježiadne:
vytlačiť ('Spájanie zlyhalo pre priečinok:', cesta k priečinku)
vrátiť

# Orezať zošitý obrázok
cropped_image = crop_image (zošitý_obrázok)

# Ukážte a uložte zošitý obrázok
folder_name = os.path.basename (folder_path)
preview_and_save_image (orezaný_obrázok, cesta k priečinku, názov priečinka)

Zadajte cestu priečinka s obrázkami, ktoré chcete spojiť.

stitch_folder('sample_images') 

Obrázky, ktoré používate, by mali obsahovať prekrývajúce sa prvky. Týmito funkciami môže byť čokoľvek od významných orientačných bodov až po vzory textúr na obrázku. OpenCV ich používa ako referenčný bod na zarovnanie obrázkov.

Bez týchto funkcií bude pre OpenCV ťažké zarovnať obrázky a vytvoriť plynulú panorámu.

Testovanie vášho programu

Zbierajte obrázky, ktoré chcete premeniť na panoramatický obrázok. Uistite sa, že majú prekrývajúce sa funkcie.

Pozrite sa na kopec na tomto prvom obrázku.

Na tomto druhom obrázku je kopec mierne viditeľný. Tým sa vytvorí prekrývajúci sa prvok.

Uložte obrázky do priečinka. Zadajte cestu k priečinku stitch_folder funkcia na šitie. A potom spustite program.

Program spojil obrázky dohromady a vytvoril panoramatický obrázok so širším pohľadom na scénu. Upozorňujeme, že na vytvorenie vyššie uvedeného panoramatického obrázka bolo použitých deväť obrázkov, ktoré sa nachádzajú vo vyššie uvedenom úložisku GitHub.

Manipulácia s obrázkami pomocou OpenCV

Vytváranie panorám demonštruje niektoré z mnohých techník manipulácie s obrázkami, ktoré OpenCV ponúka. Existuje viac techník, ktoré môžete použiť na manipuláciu s obrázkami tak, aby vyhovovali vašim potrebám. Práca na viacerých projektoch zahŕňajúcich manipuláciu s obrázkami vám pomôže zlepšiť vaše počítačové videnie vo všeobecnosti.