Az OpenCV Python könyvtár lehetővé tette a több kép egyetlen panorámaképbe egyesítése folyamatának automatizálását.

A panorámafotózás olyan szélesebb látómező rögzítésének technikája, amelyet egyetlen fényképpel nem lehet elérni. Ez a technika több képet összefűz, hogy egyetlen képet hozzon létre, amely magával ragadó módon rögzíti a teljes jelenetet.

A Python segítségével ezt a folyamatot automatizálhatja, és könnyedén készíthet gyönyörű panorámákat.

A Python-környezet beállítása

A követéshez rendelkeznie kell a a Python alapvető ismerete. Indítson el bármilyen Python IDE-t és hozzon létre egy új virtuális környezetet. Hozzon létre egy új Python-fájlt. És a terminálon futtassa a következő parancsot az OpenCV telepítéséhez.


pip install opencv-contrib-python

Használni fogja a opencv-contrib-python könyvtárat a képek betöltéséhez és kezeléséhez. Megvan benne a cv2.Stitcher osztályt, amelyet a panorámák elkészítéséhez fog használni.

A cikkben használt teljes forráskód és mintaképek itt érhetők el GitHub adattár.

A szükséges könyvtárak importálása

Importálja a cv2 és os modulokat a szkriptbe. Az operációs rendszert fogja használni a rendszerútvonalak közötti navigációhoz.

import cv2
import os

A OS modul a Python beépített modulja. Ez az oka annak, hogy nem kell külsőleg telepítenie.

Képek betöltése

Hozzon létre egy funkciót az összefűzni kívánt képek betöltéséhez. Először hozzon létre egy üres listát, amely tárolja a kezdeti képeket. Ezután böngéssze végig a mappa elérési útjában található fájlokat, és ellenőrizze, hogy a fájl kép-e. Ha ez egy kép, töltse be, és fűzze hozzá a képek listájához.


defload_images(mappa_útvonala):
# Töltsön be képeket egy mappából, és méretezze át őket.
képek = []
számára fájl név ban ben os.listdir (mappa_útvonala):
# Ellenőrizze, hogy a fájl képfájl-e
ha filename.endswith(".jpg") vagy filename.endswith(".png"):
# Töltse be a képet az OpenCV segítségével, és méretezze át
image = cv2.imread (os.path.join (mappa_útvonala, fájlnév))
images.append (kép)
Visszatérés képeket

A program változatosabbá tételéhez további képfájlformátumokat is hozzáadhat. Ez a kód csak keresni fog .jpg és .png fájlformátumok.

A képek átméretezése az egységes öltés és a gyorsabb feldolgozás érdekében

Hozzon létre egy függvényt, amely átméretezi a képek listáját. A funkció végigpörget minden képet a listában, és átméretezi azokat. Végül csatolja az átméretezett képeket egy új listához.


defresize_images(képek, szélesség, magasság):
resized_images = []
számára kép ban ben képek:
resized_image = cv2.resize (kép, (szélesség, magasság))
resized_images.append (átméretezett_kép)
Visszatérés átméretezett_képek

Az átméretezés biztosítja, hogy a képek összeillesztése egyenletes legyen. A gyorsabb feldolgozás érdekében csökkenti a fájl méretét is.

Az OpenCV összefűző moduljának használata a képek összefűzéséhez

Hozzon létre egy funkciót az átméretezett képek összeillesztéséhez. Ezt a technikát általában panorámakészítésnek nevezik. A funkció a képek listáját veszi be bemenetként. Használja a Fűzőgép modult, hogy összeillessze őket. Végül a függvény összefűzött képet és állapotkódot ad vissza.


defstitch_images(képek):
stitcher = cv2.Stitcher.create()
(állapot, összefűzött_kép) = stitcher.stitch (képek)
ha status == cv2.STITCHER_OK:
Visszatérés összefűzött_kép
más:
VisszatérésEgyik sem

Ha az öltés sikeres volt (amint azt a cv2.STITCHER_OK állapotkód), a funkció visszaadja az összefűzött képet. Ellenkező esetben vissza fog térni Egyik sem.

Az összefűzött kép kivágása

Hozzon létre egy függvényt, amely beveszi az összefűzött képet, és a kivágás után visszaadja azt. Először alakítsa át az összefűzött képet szürkeárnyalatossá. Ezután alkalmazzon bináris küszöböt a bináris kép létrehozásához. Végül keresse meg a bináris kép legnagyobb kontúrját, és számítsa ki annak határoló téglalapját.


defcrop_image(kép):
szürke = cv2.cvtColor (kép, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (szürke, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (kontúrok[0])
cropped_image = kép[y: y + h, x: x + w]
Visszatérés cropped_image

Az összefűzött kép levágása a határoló téglalap segítségével történik.

Az összefűzött kép előnézete és mentése OpenCV használatával

Hozzon létre egy funkciót, amely interaktív ablakban jeleníti meg az összefűzött képet, és elmenti a lemezre.


defpreview_and_save_image(kép, mappa_útvonala, mappa_neve):
# Az összefűzött kép megjelenítése
cv2.namedWindow("Fűzött kép", cv2.WINDOW_NORMAL)
cv2.imshow("Fűzött kép", kép)
cv2.waitKey(0)

# Mentse el az összefűzött képet
output_filename = os.path.join (mappa_útvonala, mappa_neve + "_panorama.jpg")
cv2.imwrite (kimeneti_fájlnév, kép)
nyomtatás("Összefűzött kép mentve a mappába:", mappa neve)

A panorámakép ugyanabba a mappába kerül mentésre, amely az eredeti képeket tartalmazza.

A program folyamatának vezérlése

Hozzon létre egy függvényt, amely szabályozza a program folyamát. Ez betölti az összes képet a megadott mappából. Méretezze át és fűzze össze őket. Vágja le az összefűzött képet, jelenítse meg az előnézetét, majd mentse lemezre. Ha kettőnél kevesebb kép van a mappában, a funkció hibaüzenetet nyomtat, és összefűzés vagy mentés nélkül visszatér.


deföltés_mappa(mappa_útvonala, szélesség=800, magasság=800):
# Össze össze az összes képet egy mappába, és mentse el az eredményt.
# Töltse be a képeket a mappából
images = load_images (mappa_útvonala)

# Ellenőrizze, hogy van-e legalább két kép a mappában
ha len (képek) < 2:
nyomtatás("Nincs elég kép a mappában:", mappa_útvonala)
Visszatérés

# Méretezze át a képeket
resized_images = resize_images (képek, szélesség, magasság)

# Fűzze össze a képeket
összefűzött_kép = összefűzött_képek (átméretezett_képek)
ha összefűzött_kép vanEgyik sem:
nyomtatás("Nem sikerült összefűzni a következő mappát:", mappa_útvonala)
Visszatérés

# Vágja le az összefűzött képet
cropped_image = crop_image (összefűzött_kép)

# Az összefűzött kép előnézete és mentése
mappa_neve = os.útvonal.alapnév (mappa_útvonala)
preview_and_save_image (kivágott_kép, mappa_útvonala, mappa_neve)

Adja meg az összefűzni kívánt képeket tartalmazó mappa elérési útját.

stitch_folder('sample_images') 

A használt képeknek átfedő jellemzőket kell tartalmazniuk. Ezek a jellemzők a feltűnő tereptárgyaktól a kép textúramintáiig bármi lehet. Az OpenCV referenciapontként használja őket a képek igazításához.

E funkciók nélkül az OpenCV nehezen tudja összehangolni a képeket, és zökkenőmentes panorámát hozzon létre.

A program tesztelése

Gyűjtse össze azokat a képeket, amelyeket panorámaképpé szeretne alakítani. Győződjön meg arról, hogy átfedő jellemzőkkel rendelkeznek.

Vessen egy pillantást a dombra ezen az első képen.

Ezen a második képen a domb kissé látható. Ez átfedő jellemzőt hoz létre.

Mentse el a képeket egy mappába. Adja meg a mappa elérési útját a öltés_mappa varrás funkció. És akkor futtassa a programot.

A program összefűzte a képeket, és panorámaképet készített a jelenetről szélesebb körben. Vegye figyelembe, hogy a fenti panorámakép létrehozásához kilenc olyan képet használtak, amelyek a fent említett GitHub-tárolóban találhatók.

Képek kezelése OpenCV használatával

A panorámaképek készítése bemutat néhányat az OpenCV által kínált képkezelési technikák közül. Több technika is használható a képek igény szerinti manipulálására. Ha több, képmanipulációt magában foglaló projekten dolgozik, akkor általánosságban javíthatja számítógépes látási készségeit.