Stulbinančių panoraminių nuotraukų kūrimas naudojant Python OpenCV

Vaizdų sujungimas naudojant Python ir OpenCV apima kelių vaizdų sujungimą, kad būtų sukurtas panoraminis arba plataus lauko vaizdas. Šis procesas dažniausiai naudojamas fotografijoje, siekiant sujungti persidengiančius vaizdus ir sukurti vientisą panoramą. Štai pagrindinis aprašymas, kaip susieti vaizdus naudojant OpenCV:

Vaizdo išankstinis apdorojimas

Įkelkite norimus susieti vaizdus naudodami OpenCV cv2.imread() funkciją.

cv2.cvtColor() Jei reikia, konvertuokite vaizdus į pilkos spalvos tonus .

Naudodami funkcijų aptikimo algoritmus, pvz., SIFT, ORB arba AKAZE, aptikkite pagrindines vaizdų funkcijas.

Funkcijų atitikimas

Naudokite funkcijų atitikimo metodus, kad rastumėte atitinkamus taškus tarp vaizdų.

„OpenCV“ teikia tokias funkcijas kaip cv2.BFMatcher() arba cv2.FlannBasedMatcher() funkcijų atitikimui.

Homografijos įvertinimas

Apskaičiuokite homografijos matricą naudodami atitinkamus taškus, rastus ankstesniame žingsnyje.

Homografijos matrica apibūdina transformaciją tarp dviejų vaizdų.

Kreipimas ir susiuvimas

Naudokite homografinę matricą, kad iškreiptumėte vieną iš vaizdų, kad jie būtų suderinti su kitu.

Funkcija cv2.warpPerspective() gali būti naudojama šiam tikslui.

Sujunkite iškreiptą vaizdą su kitu vaizdu, kad sukurtumėte susietą panoramą.

Maišymas(nebūtina)

Taikykite vaizdų maišymo metodus, kad sklandžiai sujungtumėte susietus vaizdus.

Galima naudoti tokius metodus kaip linijinis maišymas arba kelių juostų maišymas.

Rodyti arba Išsaugoti

Rodykite susietą panoramą naudodami cv2.imshow() arba išsaugokite ją naudodami cv2.imwrite().

 

Štai supaprastinto kodo pavyzdys, parodantis vaizdų susiuvimo procesą naudojant OpenCV:

import cv2  
  
# Load images  
image1 = cv2.imread('image1.jpg')  
image2 = cv2.imread('image2.jpg')  
  
# Convert images to grayscale  
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)  
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)  
  
# Detect key features and descriptors  
orb = cv2.ORB_create()  
keypoints1, descriptors1 = orb.detectAndCompute(gray1, None)  
keypoints2, descriptors2 = orb.detectAndCompute(gray2, None)  
  
# Feature matching  
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)  
matches = matcher.match(descriptors1, descriptors2)  
  
# Apply ratio test to filter good matches  
matches = [match for match in matches if match.distance < 0.7 * max(len(matches), 1)]  
  
# Find corresponding points  
src_pts = [keypoints1[match.queryIdx].pt for match in matches]  
dst_pts = [keypoints2[match.trainIdx].pt for match in matches]  
  
# Calculate homography matrix  
homography, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)  
  
# Warp and stitch images  
stitched_image = cv2.warpPerspective(image1, homography,(image1.shape[1] + image2.shape[1], image1.shape[0]))  
stitched_image[0:image2.shape[0], 0:image2.shape[1]] = image2  
  
# Display or save the stitched image  
cv2.imshow('Stitched Image', stitched_image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Atkreipkite dėmesį, kad šis pavyzdys yra supaprastintas demonstravimas. Praktiškai gali tekti spręsti tokias problemas kaip vaizdo išlygiavimas, maišymas ir iškraipymo taisymas, kad gautumėte aukštos kokybės panoraminius vaizdus.