OpenCV Pythoni teek on võimaldanud automatiseerida mitme pildi liitmise protsessi üheks panoraampildiks.
Panoraamfotograafia on laiema vaatevälja jäädvustamise tehnika, mida ühe fotoga ei saavutata. See tehnika liidab mitu pilti kokku, et luua üks pilt, mis jäädvustab kogu stseeni kaasahaarval viisil.
Pythoni abil saate seda protsessi automatiseerida ja luua hõlpsalt kauneid panoraame.
Pythoni keskkonna seadistamine
Järgimiseks peaks teil olema a põhiteadmised Pythonist. Käivitage mis tahes Pythoni IDE ja luua uus virtuaalne keskkond. Looge uus Pythoni fail. Ja terminalis käivitage OpenCV installimiseks järgmine käsk.
pip install opencv-contrib-python
Sa kasutad opencv-contrib-python raamatukogu piltide laadimiseks ja nendega manipuleerimiseks. Sellel on cv2.Õmbleja klassi, mida kasutate panoraamide loomiseks.
Selles artiklis kasutatud täielik lähtekood ja näidispildid on saadaval selles GitHubi hoidla.
Nõutavate teekide importimine
Importige cv2 ja os moodulid oma skripti. Süsteemiteedel navigeerimiseks kasutate operatsioonisüsteemi.
importida cv2
importida os
The OS-i moodul on Pythoni sisseehitatud moodul. See on põhjus, miks te ei pea seda väliselt installima.
Piltide laadimine
Looge funktsioon piltide laadimiseks, mida soovite ühendada. Esiteks looge tühi loend, mis salvestab esialgsed pildid. Seejärel sirvige läbi iga faili kaustateel ja kontrollige, kas fail on pilt. Kui see on pilt, laadige see üles ja lisage see piltide loendisse.
defload_images(kausta_tee):
# Laadige pilte kaustast ja muutke nende suurust.
pildid = []
jaoks faili nimi sisse os.listdir (kausta_tee):
# Kontrollige, kas fail on pildifail
kui failinimi.endswith(".jpg") või failinimi.endswith(".png"):
# Laadige pilt OpenCV abil ja muutke selle suurust
pilt = cv2.imread (os.path.join (kausta_tee, failinimi))
images.append (pilt)
tagasi pilte
Saate oma programmi mitmekesistamiseks lisada rohkem pildifailivorminguid. See kood ainult otsib .jpg ja .png failivormingud.
Piltide suuruse muutmine ühtse õmbluse ja kiiremaks töötlemiseks
Looge funktsioon, mis muudab piltide loendi suurust. Funktsioon liigub loendis läbi iga pildi ja muudab selle suurust. Lõpuks lisage muudetud suurusega pildid uude loendisse.
defresize_images(pildid, laius, kõrgus):
resized_images = []
jaoks pilt sisse pildid:
resized_image = cv2.resize (pilt, (laius, kõrgus))
resized_images.append (resized_image)
tagasi muudetud_pildid
Suuruse muutmine tagab piltide ühtluse. Samuti vähendab see faili suurust kiiremaks töötlemiseks.
OpenCV õmblusmooduli kasutamine piltide kokkuõmblemiseks
Looge funktsioon muudetud suurusega piltide kokkuliitmiseks. Seda tehnikat tuntakse üldiselt kui panoraami loomist. Funktsioon võtab sisendiks piltide loendi. Kasuta Õmbleja moodul, et need kokku õmmelda. Lõpuks tagastab funktsioon õmmeldud pildi ja olekukoodi.
defstitch_images(pildid):
stitcher = cv2.Stitcher.create()
(olek, õmmeldud_pilt) = stitcher.stitch (pildid)
kui olek == cv2.STITCHER_OK:
tagasi õmmeldud_pilt
muidu:
tagasiMitte ühtegi
Kui õmblemine õnnestus (nagu näitab cv2.STITCHER_OK olekukood), tagastab funktsioon õmmeldud pildi. Vastasel juhul tuleb see tagasi Mitte ühtegi.
Õmmeldud pildi kärpimine
Looge funktsioon, mis võtab kokku õmmeldud pildi ja tagastab selle pärast kärpimist. Esmalt teisendage õmmeldud pilt halltooniks. Seejärel rakendage kahendkujutise loomiseks binaarset läve. Lõpuks leidke kahendkujutise suurim kontuur ja arvutage seda piirav ristkülik.
defcrop_image(pilt):
hall = cv2.cvtColor (pilt, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (hall, 0, 255, cv2.THRESH_BINARY)[1]
kontuurid = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (kontuurid[0])
kärbitud_pilt = pilt[y: y + h, x: x + w]
tagasi kärbitud_pilt
Õmmeldud kujutist kärbitakse piirava ristküliku abil.
Õmmeldud pildi eelvaade ja salvestamine OpenCV abil
Looge funktsioon, mis kuvab ühendatud pildi interaktiivses aknas ja salvestab selle kettale.
defeelvaade_ja_salvesta_pilt(pilt, kausta_tee, kausta_nimi):
# Kuvage ühendatud pilt
cv2.namedWindow('õmmeldud pilt', cv2.WINDOW_NORMAL)
cv2.imshow('õmmeldud pilt', pilt)
cv2.waitKey(0)
# Salvestage õmmeldud pilt
väljundi_failinimi = os.path.join (kausta_tee, kausta_nimi + '_panorama.jpg')
cv2.imwrite (väljundfaili_nimi, pilt)
print('Kausta salvestatud liidetud pilt:', kausta_nimi)
Panoraampilt salvestatakse samasse kausta, mis sisaldab originaalpilte.
Programmi voo juhtimine
Looge funktsioon, mis juhib teie programmi voogu. See laadib kõik pildid määratud kaustast. Muutke nende suurust ja õmblege need kokku. Kärbige ühendatud pilti, kuvage selle eelvaade ja salvestage see seejärel kettale. Kui kaustas on vähem kui kaks pilti, prindib funktsioon veateate ja naaseb ilma õmblemise või salvestamiseta.
defstitch_folder(kausta_tee, laius=800, kõrgus =800):
# Õmble kõik pildid kausta ja salvestage tulemus.
# Laadige pildid kaustast
pildid = load_images (kausta_tee)# Kontrollige, kas kaustas on vähemalt kaks pilti
kui len (pildid) < 2:
print("Kaustas pole piisavalt pilte:", kausta_tee)
tagasi# Muutke piltide suurust
resized_images = resize_images (pildid, laius, kõrgus)# Õmble pildid kokku
õmmeldud_pilt = stitch_images (suurusega_pildid)
kui õmmeldud_pilt onMitte ühtegi:
print("Kausta ühendamine ebaõnnestus:", kausta_tee)
tagasi# Kärpige kokkuõmmeldud pilti
kärbitud_pilt = crop_image (õmmeldud_pilt)
# Vaadake õmmeldud kujutist ja salvestage see
kausta_nimi = os.tee.basenimi (kausta_tee)
eelvaade_ja_save_image (kärbitud_pilt, kausta_tee, kausta_nimi)
Edastage kausta tee, mis sisaldab pilte, mida soovite ühendada.
stitch_folder('sample_images')
Kasutatavad pildid peaksid sisaldama kattuvaid funktsioone. Need funktsioonid võivad olla kõik, alates silmapaistvatest maamärkidest kuni pildi tekstuurimustriteni. OpenCV kasutab neid võrdluspunktina piltide joondamiseks.
Ilma nende funktsioonideta on OpenCV-l raske pilte joondada ja luua sujuvat panoraami.
Programmi testimine
Koguge pildid, mida soovite panoraampildiks muuta. Veenduge, et nende funktsioonid kattuvad.
Vaadake sellel esimesel pildil olevat mäge.
Sellel teisel pildil on mägi veidi näha. See loob kattuva funktsiooni.
Salvestage pildid kausta. Edastage kausta tee stitch_folder funktsioon õmblemiseks. Ja seejärel käivitage programm.
Programm õmbles pildid kokku ja lõi stseeni laiema vaatega panoraampildi. Pange tähele, et ülaltoodud panoraampildi loomiseks kasutati üheksat pilti, mis on ülalmainitud GitHubi hoidlas.
Piltide manipuleerimine OpenCV abil
Panoraamide loomine demonstreerib mõnda paljudest OpenCV pakutavatest pilditöötlustehnikatest. Piltide oma vajadustele vastavaks manipuleerimiseks saate kasutada rohkem tehnikaid. Rohkemate piltidega manipuleerimist hõlmavate projektidega töötamine aitab teil üldiselt parandada oma arvutinägemise oskusi.