OpenCV Python biblioteka leido automatizuoti kelių vaizdų sujungimo į vieną panoraminį vaizdą procesą.

Panoraminė fotografija yra platesnio matymo lauko fiksavimo technika, kurios viena nuotrauka negali pasiekti. Ši technika sujungia kelis vaizdus, ​​kad būtų sukurtas vienas vaizdas, įtraukiantis visą sceną.

Naudodami Python galite automatizuoti šį procesą ir lengvai sukurti gražias panoramas.

Python aplinkos nustatymas

Norėdami tęsti, turėtumėte turėti a Pagrindinis Python supratimas. Paleiskite bet kurį Python IDE ir sukurti naują virtualią aplinką. Sukurkite naują Python failą. Ir terminale paleiskite šią komandą, kad įdiegtumėte OpenCV.


pip įdiegti opencv-contrib-python

Jūs naudosite opencv-contrib-python biblioteką, kad galėtumėte įkelti vaizdus ir jais manipuliuoti. Jame yra cv2.Stitcher klasė, kurią naudosite kurdami panoramas.

Šiame straipsnyje rasite visą šaltinio kodą ir vaizdų pavyzdžius GitHub saugykla.

Reikalingų bibliotekų importavimas

Importuoti cv2 ir os modulius į savo scenarijų. Norėdami naršyti sistemos keliais, naudosite OS.

instagram viewer
importuoti cv2
importuoti os

The OS modulis yra integruotas Python modulis. Dėl šios priežasties jums nereikia jo įdiegti iš išorės.

Įkeliami vaizdai

Sukurkite vaizdų, kuriuos norite susieti, įkėlimo funkciją. Pirmiausia sukurkite tuščią sąrašą, kuriame bus saugomi pradiniai vaizdai. Tada peržiūrėkite kiekvieną aplanko kelyje esantį failą ir patikrinkite, ar failas yra vaizdas. Jei tai vaizdas, įkelkite ir pridėkite jį prie vaizdų sąrašo.


defload_images(aplanko_kelias):
# Įkelkite vaizdus iš aplanko ir pakeiskite jų dydį.
vaizdai = []
dėl failo pavadinimas in os.listdir (folder_path):
# Patikrinkite, ar failas yra vaizdo failas
jeigu filename.endswith(„.jpg“) arba filename.endswith(„.png“):
# Įkelkite vaizdą naudodami OpenCV ir pakeiskite jo dydį
vaizdas = cv2.imread (os.path.join (aplanko_kelias, failo pavadinimas))
images.append (vaizdas)
grąžinti vaizdai

Norėdami paįvairinti programą, galite pridėti daugiau vaizdo failų formatų. Šis kodas tik ieškos .jpg ir .png failų formatai.

Vaizdų dydžio keitimas, kad būtų vienodas dygsnis ir greitesnis apdorojimas

Sukurkite funkciją, kuri pakeis vaizdų sąrašo dydį. Funkcija peržiūrės kiekvieną sąraše esantį vaizdą ir pakeis jo dydį. Galiausiai pridėkite pakeisto dydžio vaizdus į naują sąrašą.


defresize_images(vaizdai, plotis, aukštis):
resized_images = []
dėl vaizdas in vaizdai:
resized_image = cv2.resize (vaizdas, (plotis, aukštis))
resized_images.append (resized_image)
grąžinti pakeisto dydžio_vaizdai

Keičiant dydį užtikrinama, kad vaizdų susiuvimas būtų vienodas. Tai taip pat sumažina failo dydį, kad būtų galima greičiau apdoroti.

„OpenCV“ susiuvimo modulio naudojimas vaizdams susieti

Sukurkite pakeisto dydžio vaizdų sujungimo funkciją. Ši technika plačiai žinoma kaip panoramos kūrimas. Funkcija kaip įvestį paims vaizdų sąrašą. Naudoti Siuvėjas modulį, kad galėtumėte juos sujungti. Galiausiai funkcija grąžins susiūtą vaizdą ir būsenos kodą.


defstitch_images(vaizdai):
stitcher = cv2.Stitcher.create()
(būsena, susiūtas_vaizdas) = ​​stitcher.stitch (vaizdai)
jeigu status == cv2.STITCHER_OK:
grąžinti susiūtas_vaizdas
Kitas:
grąžintiNė vienas

Jei susiuvimas buvo sėkmingas (kaip nurodyta cv2.STITCHER_OK būsenos kodas), funkcija grąžins susiūtą vaizdą. Priešingu atveju jis grįš Nė vienas.

Susiūto vaizdo apkarpymas

Sukurkite funkciją, kuri priims susiūtą vaizdą ir grąžins jį apkarpius. Pirmiausia konvertuokite susiūtą vaizdą į pilkos spalvos tonus. Tada pritaikykite dvejetainį slenkstį, kad sukurtumėte dvejetainį vaizdą. Galiausiai raskite didžiausią dvejetainio vaizdo kontūrą ir apskaičiuokite jo ribojantį stačiakampį.


defapkarpyti nuotrauką(vaizdas):
pilka = cv2.cvtColor (vaizdas, cv2.COLOR_BGR2GRAY)
slenkstis = cv2.threshold (pilka, 0, 255, cv2.THRESH_BINARY)[1]
kontūrai = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (contours[0])
apkarpytas_vaizdas = vaizdas[y: y + h, x: x + w]
grąžinti apkarpytas_vaizdas

Susiūtas vaizdas apkarpomas naudojant ribojantį stačiakampį.

Susieto vaizdo peržiūra ir išsaugojimas naudojant OpenCV

Sukurkite funkciją, kuri parodys susiūtą vaizdą interaktyviame lange ir išsaugos jį diske.


defperžiūrėti_ir_išsaugoti_vaizdą(vaizdas, aplanko_kelias, aplanko_pavadinimas):
# Rodyti susiūtą vaizdą
cv2.namedWindow(„Susiūtas vaizdas“, cv2.WINDOW_NORMAL)
cv2.imshow(„Susiūtas vaizdas“, vaizdas)
cv2.waitKey(0)

# Išsaugokite susiūtą vaizdą
output_filename = os.path.join (aplanko_kelias, aplanko_pavadinimas + '_panorama.jpg')
cv2.imwrite (išvesties_failo pavadinimas, vaizdas)
spausdinti („Sujungtas vaizdas išsaugotas aplanke:“, aplanko_pavadinimas)

Panoraminis vaizdas išsaugomas tame pačiame aplanke, kuriame yra originalūs vaizdai.

Programos srauto valdymas

Sukurkite funkciją, kuri valdys jūsų programos eigą. Jis įkels visus vaizdus iš nurodyto aplanko. Pakeiskite dydį ir sujunkite juos. Apkarpykite susiūtą vaizdą, parodykite jo peržiūrą ir išsaugokite diske. Jei aplanke yra mažiau nei du vaizdai, funkcija išspausdins klaidos pranešimą ir grįš neatlikdama jokio susiuvimo ar išsaugojimo.


defdygsnio_aplankas(aplanko_kelias, plotis=800, aukštis =800):
# Sujunkite visus vaizdus aplanke ir išsaugokite rezultatą.
# Įkelkite vaizdus iš aplanko
vaizdai = load_images (aplanko_kelias)

# Patikrinkite, ar aplanke yra bent du vaizdai
jeigu len (vaizdai) < 2:
spausdinti („Aplanke nepakanka vaizdų:“, aplanko_kelias)
grąžinti

# Pakeiskite vaizdų dydį
resized_images = keisti vaizdų dydį (vaizdai, plotis, aukštis)

# Sujunkite vaizdus
„stitched_image“ = „stitch_images“ (pakeisto_vaizdų dydis)
jeigu susiūtas_vaizdas yraNė vienas:
spausdinti („Nepavyko sujungti aplanko:“, aplanko_kelias)
grąžinti

# Apkirpkite susiūtą vaizdą
cropped_image = crop_image (susiūtas_vaizdas)

# Peržiūrėkite ir išsaugokite susiūtą vaizdą
aplanko_pavadinimas = os.path.basename (aplanko_kelias)
preview_and_save_image (apkarpytas_vaizdas, aplanko_kelias, aplanko_pavadinimas)

Pereikite aplanko kelią, kuriame yra vaizdai, kuriuos norite susieti.

stitch_folder('sample_images') 

Naudojamuose vaizduose turi būti sutampančių funkcijų. Šios funkcijos gali būti bet kokios – nuo ​​ryškių orientyrų iki tekstūros raštų vaizde. „OpenCV“ juos naudoja kaip atskaitos tašką vaizdams sulygiuoti.

Be šių funkcijų OpenCV bus sunku suderinti vaizdus ir sukurti vientisą panoramą.

Jūsų programos testavimas

Surinkite vaizdus, ​​kuriuos norite paversti panoraminiu vaizdu. Įsitikinkite, kad jų funkcijos persidengia.

Pažvelkite į kalvą šiame pirmame paveikslėlyje.

Šiame antrame paveikslėlyje kalva šiek tiek matoma. Taip sukuriama persidengianti funkcija.

Išsaugokite vaizdus į aplanką. Perduokite aplanko kelią į dygsnio_aplankas susiuvimo funkcija. Ir tada paleiskite programą.

Programa sujungė vaizdus ir sukūrė panoraminį vaizdą su platesniu scenos vaizdu. Atkreipkite dėmesį, kad kuriant aukščiau pateiktą panoraminį vaizdą, buvo naudojami devyni vaizdai, esantys aukščiau minėtoje „GitHub“ saugykloje.

Vaizdų manipuliavimas naudojant OpenCV

Panoramų kūrimas parodo kai kuriuos iš daugelio OpenCV siūlomų vaizdo manipuliavimo metodų. Yra ir daugiau būdų, kuriais galite manipuliuoti vaizdais pagal savo poreikius. Dirbdami su daugiau projektų, susijusių su vaizdo manipuliavimu, apskritai pagerinsite kompiuterinio matymo įgūdžius.