OpenCV Python -kirjasto on mahdollistanut useiden kuvien yhdistämisen yhdeksi panoraamakuvaksi automatisoinnin.

Panoraamakuvaus on tekniikka, jolla vangitaan laajempi näkökenttä, jota yksittäinen valokuva ei pysty saavuttamaan. Tämä tekniikka yhdistää useita kuvia yhteen, jolloin saadaan yksi kuva, joka vangitsee koko kohtauksen mukaansatempaavalla tavalla.

Pythonin avulla voit automatisoida tämän prosessin ja luoda kauniita panoraamoja helposti.

Python-ympäristön määrittäminen

Jotta voit jatkaa, sinulla pitäisi olla a Pythonin perustiedot. Käynnistä mikä tahansa Python IDE ja luoda uusi virtuaaliympäristö. Luo uusi Python-tiedosto. Asenna OpenCV suorittamalla terminaalissa seuraava komento.


pip asennus opencv-contrib-python

Tulet käyttämään opencv-contrib-python kirjasto kuvien lataamiseen ja käsittelemiseen. Siinä on cv2.Stitcher luokkaa, jota käytät panoraamien luomiseen.

Tässä artikkelissa käytetyt täydelliset lähdekoodit ja esimerkkikuvat ovat saatavilla tästä GitHub-arkisto.

Vaadittujen kirjastojen tuonti

Tuo cv2 ja os moduulit käsikirjoitukseen. Käytät käyttöjärjestelmää navigoidaksesi järjestelmäpoluilla.

tuonti cv2
tuonti os

The OS-moduuli on Pythonin sisäänrakennettu moduuli. Tästä syystä sinun ei tarvitse asentaa sitä ulkoisesti.

Ladataan kuvia

Luo toiminto, jolla ladataan kuvat, jotka haluat yhdistää. Luo ensin tyhjä luettelo, joka tallentaa alkuperäiset kuvat. Selaa sitten jokaisen kansiopolun tiedostoa ja tarkista, onko tiedosto kuva. Jos se on kuva, lataa ja liitä se kuvaluetteloon.


defload_images(kansion_polku):
# Lataa kuvia kansiosta ja muuta niiden kokoa.
kuvat = []
varten Tiedoston nimi sisään os.listdir (folder_path):
# Tarkista, onko tiedosto kuvatiedosto
jos filename.endswith(".jpg") tai filename.endswith(".png"):
# Lataa kuva OpenCV: llä ja muuta sen kokoa
image = cv2.imread (os.path.join (kansion_polku, tiedostonimi))
images.append (kuva)
palata kuvia

Voit lisätä kuvatiedostomuotoja monipuolistaaksesi ohjelmaa. Tämä koodi vain etsii .jpg ja .png tiedostomuotoja.

Kuvien koon muuttaminen yhtenäisen ompeleen ja nopeamman käsittelyn saavuttamiseksi

Luo toiminto, joka muuttaa kuvaluettelon kokoa. Toiminto käy läpi jokaisen luettelon kuvan ja muuttaa sen kokoa. Liitä lopuksi muutetut kuvat uuteen luetteloon.


defresize_images(kuvat, leveys, korkeus):
resized_images = []
varten kuva sisään kuvat:
resized_image = cv2.resize (kuva, (leveys, korkeus))
resized_images.append (resized_image)
palata resized_images

Koon muuttaminen varmistaa, että kuvien ompeleet ovat tasaisia. Se myös pienentää tiedostokokoa nopeuttaakseen käsittelyä.

OpenCV: n Stitcher-moduulin käyttäminen kuvien yhdistämiseen

Luo toiminto, jonka kokoa muutetut kuvat liitetään yhteen. Tämä tekniikka tunnetaan yleisesti panoraaman luomisena. Toiminto ottaa syötteeksi luettelon kuvista. Käytä Tikkuri moduuli ompelemaan ne yhteen. Lopuksi toiminto palauttaa ommeltu kuvan ja tilakoodin.


defstitch_images(kuvat):
stitcher = cv2.Stitcher.create()
(tila, ommeltu_kuva) = stitcher.stitch (kuvat)
jos status == cv2.STITCHER_OK:
palata ommeltu_kuva
muu:
palataEi mitään

Jos ompelu onnistui (kuten cv2.STITCHER_OK tilakoodi), toiminto palauttaa ommeltu kuvan. Muuten se tulee takaisin Ei mitään.

Ommellun kuvan rajaus

Luo funktio, joka ottaa ommeltu kuvan ja palauttaa sen rajauksen jälkeen. Muunna ensin ommeltu kuva harmaasävyiksi. Luo sitten binäärikuva luomalla binaarikynnys. Etsi lopuksi binäärikuvan suurin ääriviiva ja laske sen rajaava suorakulmio.


defcrop_image(kuva):
harmaa = cv2.cvtColor (kuva, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (harmaa, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (ääriviivat[0])
rajattu_kuva = kuva[y: y + h, x: x + w]
palata rajattu_kuva

Ommeltu kuva rajataan käyttämällä rajattua suorakulmiota.

Odotetun kuvan esikatselu ja tallentaminen OpenCV: llä

Luo toiminto, joka näyttää yhdistetyn kuvan interaktiivisessa ikkunassa ja tallentaa sen levylle.


defesikatsele_ja_tallenna_kuva(kuva, kansion_polku, kansion_nimi):
# Näytä ommeltu kuva
cv2.namedWindow("Ommeltu kuva", cv2.WINDOW_NORMAL)
cv2.imshow("Ommeltu kuva", kuva)
cv2.waitKey(0)

# Tallenna ommeltu kuva
output_filename = os.polku.liitos (kansion_polku, kansion_nimi + '_panorama.jpg')
cv2.imwrite (tulostustiedoston_nimi, kuva)
Tulosta('Ommeltu kuva tallennettu kansioon:', kansion nimi)

Panoraamakuva tallennetaan samaan kansioon, joka sisältää alkuperäiset kuvat.

Ohjelmasi kulun hallinta

Luo toiminto, joka ohjaa ohjelman kulkua. Se lataa kaikki kuvat määritetystä kansiosta. Muuta niiden kokoa ja liitä ne yhteen. Rajaa ommeltu kuva, näytä sen esikatselu ja tallenna se sitten levylle. Jos kansiossa on vähemmän kuin kaksi kuvaa, toiminto tulostaa virheilmoituksen ja palaa ilman ompelua tai tallennusta.


defstitch_folder(kansion_polku, leveys=800, korkeus =800):
# Liitä kaikki kuvat kansioon ja tallenna tulos.
# Lataa kuvat kansiosta
kuvat = load_images (kansion_polku)

# Tarkista, onko kansiossa vähintään kaksi kuvaa
jos len (kuvat) < 2:
Tulosta("Kansiossa ei ole tarpeeksi kuvia:", folder_path)
palata

# Muuta kuvien kokoa
resized_images = resize_images (kuvat, leveys, korkeus)

# Ompele kuvat
stitched_image = stitch_images (resized_images)
jos ommeltu_kuva OnEi mitään:
Tulosta("Kansion liittäminen epäonnistui:", folder_path)
palata

# Rajaa ommeltu kuva
cropped_image = rajauskuva (ommeltu_kuva)

# Esikatsele ja tallenna ommeltu kuva
kansion_nimi = os.path.basename (kansion_polku)
esikatselu_ja_tallenna_kuva (rajattu_kuva, kansion_polku, kansion_nimi)

Ohita kansiopolku, joka sisältää yhdistettävät kuvat.

stitch_folder('sample_images') 

Käyttämiesi kuvien tulee sisältää päällekkäisiä ominaisuuksia. Nämä ominaisuudet voivat olla mitä tahansa näkyvistä maamerkeistä kuvan pintakuvioihin. OpenCV käyttää niitä vertailukohtana kuvien kohdistamiseen.

Ilman näitä ominaisuuksia OpenCV: n on vaikea kohdistaa kuvia ja luoda saumaton panoraama.

Ohjelmasi testaus

Kerää kuvat, jotka haluat muuntaa panoraamakuvaksi. Varmista, että niissä on päällekkäisiä ominaisuuksia.

Katso mäkeä tässä ensimmäisessä kuvassa.

Tässä toisessa kuvassa mäki on hieman näkyvissä. Tämä luo päällekkäisen ominaisuuden.

Tallenna kuvat kansioon. Välitä kansion polku osoitteeseen stitch_folder ompelutoiminto. Ja sitten suorita ohjelma.

Ohjelma liitti kuvat yhteen ja loi panoraamakuvan laajemmasta näkymästä kohtaukseen. Huomaa, että yllä olevan panoraamakuvan luomiseen käytettiin yhdeksää kuvaa, jotka ovat edellä mainitussa GitHub-arkistossa.

Kuvien käsittely OpenCV: llä

Panoraaman luominen esittelee joitain monista OpenCV: n tarjoamista kuvankäsittelytekniikoista. On enemmän tekniikoita, joilla voit muokata kuvia tarpeidesi mukaan. Useampien kuvien käsittelyyn liittyvien projektien parissa työskenteleminen auttaa sinua parantamaan tietokonenäkötaitojasi yleisesti.