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.

instagram viewer
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.