OpenCV Python-biblioteket har gjort det muligt at automatisere processen med at flette flere billeder til et enkelt panoramabillede.

Panoramafotografering er teknikken til at fange et bredere synsfelt, som et enkelt fotografi ikke kan opnå. Denne teknik syr flere billeder sammen for at skabe et enkelt billede, der fanger hele scenen på en fordybende måde.

Ved hjælp af Python kan du automatisere denne proces og nemt skabe smukke panoramaer.

Opsætning af dit Python-miljø

For at følge op skal du have en grundlæggende forståelse af Python. Start enhver Python IDE og skabe et nyt virtuelt miljø. Opret en ny Python-fil. Og på terminalen skal du køre følgende kommando for at installere OpenCV.


pip installer opencv-contrib-python

Du vil bruge opencv-contrib-python bibliotek til at indlæse billeder og manipulere dem. Den har cv2.Stitcher klasse, som du vil bruge til at oprette panoramabillederne.

Den fulde kildekode og eksempler på billeder, der bruges i denne artikel, er tilgængelige i denne GitHub-depot.

Import af de nødvendige biblioteker

Importer cv2 og os moduler ind i dit script. Du skal bruge OS til at navigere gennem systemstierne.

importere cv2
importere os

Det OS modul er et indbygget modul i Python. Dette er grunden til, at du ikke behøver at installere det eksternt.

Indlæsning af billeder

Opret en funktion til at indlæse de billeder, du vil sy. Først skal du oprette en tom liste, der gemmer de første billeder. Gå derefter gennem hver fil i mappestien og kontroller, om filen er et billede. Hvis det er et billede, skal du indlæse og tilføje det til listen over billeder.


defindlæs_billeder(mappe_sti):
# Indlæs billeder fra en mappe, og tilpas størrelsen på dem.
billeder = []
til filnavn i os.listdir (mappesti):
# Tjek om filen er en billedfil
hvis filnavn.endswith('.jpg') eller filnavn.endswith('.png'):
# Indlæs billedet ved hjælp af OpenCV og tilpas dets størrelse
image = cv2.imread (os.path.join (mappesti, filnavn))
images.append (billede)
Vend tilbage billeder

Du kan tilføje flere billedfilformater for at diversificere dit program. Denne kode vil kun lede efter .jpg og .png filformater.

Ændre størrelsen på billederne for en ensartet søm og hurtigere behandling

Opret en funktion, der vil ændre størrelsen på listen over billeder. Funktionen går gennem hvert billede på listen og ændrer størrelsen på det. Til sidst skal du tilføje de ændrede billeder til en ny liste.


defresize_images(billeder, bredde, højde):
resized_images = []
til billede i billeder:
resized_image = cv2.resize (billede, (bredde, højde))
resized_images.append (resized_image)
Vend tilbage resized_images

Ændring af størrelse sikrer, at sammensætningen af ​​billederne er ensartet. Det reducerer også filstørrelsen for hurtigere behandling.

Brug af OpenCV's Stitcher-modul til at sy billederne

Opret en funktion til at sy de ændrede størrelser sammen. Denne teknik er almindeligvis kendt som at skabe et panorama. Funktionen tager en liste over billeder som input. Brug Stitcher modul for at sy dem sammen. Endelig vil funktionen returnere et sammenføjet billede og en statuskode.


defstitch_images(billeder):
stitcher = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (billeder)
hvis status == cv2.STITCHER_OK:
Vend tilbage stitched_image
andet:
Vend tilbageIngen

Hvis syningen var vellykket (som angivet af cv2.STITCHER_OK statuskode), returnerer funktionen det sammensatte billede. Ellers vender den tilbage Ingen.

Beskæring af det sammensyede billede

Opret en funktion, der tager det sammensatte billede ind og returnerer det, når du har beskåret det. Konverter først det sammensatte billede til gråtoner. Anvend derefter en binær tærskel for at skabe et binært billede. Til sidst skal du finde den største kontur i det binære billede og beregne dets afgrænsningsrektangel.


defbeskær_billede(billede):
grå = cv2.cvtColor (billede, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold (grå, 0, 255, cv2.THRESH_BINARY)[1]
contours = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (konturer[0])
cropped_image = billede[y: y + h, x: x + w]
Vend tilbage cropped_image

Det sammensatte billede beskæres ved hjælp af afgrænsningsrektangelet.

Forhåndsvisning og lagring af det sammensatte billede ved hjælp af OpenCV

Opret en funktion, der viser det sammensatte billede i et interaktivt vindue og gemmer det på disken.


defforhåndsvisning_og_gem_billede(billede, mappesti, mappenavn):
# Vis det sammensyede billede
cv2.namedWindow('Sykket billede', cv2.WINDOW_NORMAL)
cv2.imshow('Sykket billede', billede)
cv2.waitKey(0)

# Gem det sammensyede billede
output_filename = os.sti.join (mappesti, mappenavn + '_panorama.jpg')
cv2.imwrite (output_filnavn, billede)
Print('Sykket billede gemt til mappe:', mappenavn)

Panoramabilledet gemmes i den samme mappe, som indeholder de originale billeder.

Styring af flowet i dit program

Opret en funktion, der vil kontrollere flowet af dit program. Det vil indlæse alle billeder fra den angivne mappe. Tilpas størrelsen og sy dem sammen. Beskær det sammensatte billede, vis dets forhåndsvisning, og gem det derefter på disken. Hvis der er færre end to billeder i mappen, udskriver funktionen en fejlmeddelelse og vender tilbage uden at udføre nogen syning eller lagring.


defstitch_mappe(mappesti, bredde=800, højde=800):
# Sammensæt alle billeder i en mappe, og gem resultatet.
# Indlæs billederne fra mappen
billeder = indlæs_billeder (mappesti)

# Tjek, om der er mindst to billeder i mappen
hvis len (billeder) < 2:
Print('Ikke nok billeder i mappen:', mappe_sti)
Vend tilbage

# Ændr størrelsen på billederne
resized_images = resize_images (billeder, bredde, højde)

# Sy billederne sammen
stitched_image = stitch_images (resized_images)
hvis stitched_image erIngen:
Print('Sømning mislykkedes for mappe:', mappe_sti)
Vend tilbage

# Beskær det syede billede
cropped_image = crop_image (stitched_image)

# Forhåndsvis og gem det syede billede
mappenavn = os.sti.basenavn (mappesti)
preview_and_save_image (beskæret_billede, mappesti, mappenavn)

Send mappestien, der indeholder de billeder, du vil sammensætte.

stitch_folder('sample_images') 

De billeder, du bruger, skal indeholde overlappende funktioner. Disse funktioner kan være alt fra fremtrædende vartegn til teksturmønstre i billedet. OpenCV bruger dem som referencepunkt til at justere billederne.

Uden disse funktioner vil det være svært for OpenCV at justere billederne og skabe et problemfrit panorama.

Test af dit program

Saml de billeder, du vil transformere til et panoramabillede. Sørg for, at de har overlappende funktioner.

Tag et kig på bakken på dette første billede.

På dette andet billede er bakken lidt synlig. Dette skaber en overlappende funktion.

Gem billederne i en mappe. Send mappestien til stitch_mappe funktion til syning. Og kør derefter programmet.

Programmet syede billederne sammen og skabte et panoramabillede med en bredere visning af scenen. Bemærk, at for at skabe ovenstående panoramabillede, blev der brugt ni billeder, der er til stede i det ovennævnte GitHub-lager.

Manipulation af billeder ved hjælp af OpenCV

Oprettelse af panoramaer demonstrerer nogle af de mange billedmanipulationsteknikker, som OpenCV tilbyder. Der er flere teknikker, du kan bruge til at manipulere billeder, så de passer til dit behov. At arbejde på flere projekter, der involverer billedmanipulation, vil hjælpe dig med at forbedre dine computersynsfærdigheder generelt.