OpenCV Python kitaplığı, birden çok görüntüyü tek bir panoramik görüntüde birleştirme sürecini otomatikleştirmeyi mümkün kıldı.

Panoramik fotoğrafçılık, tek bir fotoğrafın elde edemeyeceği kadar geniş bir görüş alanını yakalama tekniğidir. Bu teknik, tüm sahneyi sürükleyici bir şekilde yakalayan tek bir görüntü oluşturmak için birden fazla görüntüyü birleştirir.

Python'un yardımıyla bu işlemi otomatik hale getirebilir ve kolaylıkla güzel panoramalar oluşturabilirsiniz.

Python Ortamınızı Kurma

Takip etmek için bir temel Python anlayışı. Herhangi bir Python IDE'yi başlatın ve yeni bir sanal ortam oluştur. Yeni bir Python dosyası oluşturun. Ve terminalde, OpenCV'yi kurmak için aşağıdaki komutu çalıştırın.


pip kurulumu opencv-contrib-python

kullanacaksın opencv-contrib-python görüntüleri yüklemek ve işlemek için kitaplık. sahip cv2.Dikiş panoramaları oluşturmak için kullanacağınız sınıf.

Bu makalede kullanılan tam kaynak kodu ve örnek resimler bu makalede mevcuttur. GitHub deposu.

Gerekli Kitaplıkları İçe Aktarma

instagram viewer

içe aktar CV2 Ve işletim sistemi modülleri komut dosyanıza ekleyin. Sistem yollarında gezinmek için işletim sistemini kullanacaksınız.

içe aktarmak CV2
içe aktarmak işletim sistemi

bu işletim sistemi modülü yerleşik bir Python modülüdür. Harici olarak yüklemenize gerek olmamasının nedeni budur.

Resimleri Yükleme

Birleştirmek istediğiniz görüntüleri yüklemek için bir işlev oluşturun. İlk önce, ilk görüntüleri saklayacak boş bir liste oluşturun. Ardından, dosyanın bir görüntü olup olmadığını kontrol ederek klasör yolundaki her dosya arasında geçiş yapın. Bu bir resim ise, yükleyin ve resim listesine ekleyin.


kesinload_images(klasör yolu):
# Resimleri bir klasörden yükleyin ve yeniden boyutlandırın.
resimler = []
için dosya adı içinde os.listdir (klasör_yolu):
# Dosyanın bir görüntü dosyası olup olmadığını kontrol edin
eğer dosyaadı.bitiyor('.jpg') veya dosyaadı.bitiyor(".png"):
# Resmi OpenCV kullanarak yükleyin ve yeniden boyutlandırın
görüntü = cv2.imread (os.path.join (klasör_yolu, dosyaadı))
resimler.append (resim)
geri dönmek Görüntüler

Programınızı çeşitlendirmek için daha fazla resim dosyası formatı ekleyebilirsiniz. Bu kod yalnızca arayacak .jpg Ve .png dosya formatları.

Düzgün Bir Dikiş ve Daha Hızlı İşleme için Görüntüleri Yeniden Boyutlandırma

Görüntü listesini yeniden boyutlandıracak bir işlev oluşturun. İşlev, listedeki her görüntü arasında geçiş yapar ve yeniden boyutlandırır. Son olarak, yeniden boyutlandırılan resimleri yeni bir listeye ekleyin.


kesinresimleri yeniden boyutlandır(resimler, genişlik, yükseklik):
yeniden boyutlandırılmış resimler = []
için resim içinde Görüntüler:
resize_image = cv2.resize (resim, (genişlik, yükseklik))
resize_images.append (yeniden boyutlandırılmış_resim)
geri dönmek yeniden boyutlandırılmış resimler

Yeniden boyutlandırma, görüntülerin birleştirilmesinin tek tip olmasını sağlar. Ayrıca daha hızlı işlem için dosya boyutunu azaltır.

Görüntüleri Birleştirmek için OpenCV'nin Stitcher Modülünü Kullanma

Yeniden boyutlandırılmış görüntüleri birleştirmek için bir işlev oluşturun. Bu teknik genellikle panorama oluşturma olarak bilinir. İşlev, girdi olarak görüntülerin bir listesini alacaktır. Kullan dikiş makinesi bunları birbirine dikmek için modül. Son olarak, işlev birleştirilmiş bir görüntü ve bir durum kodu döndürür.


kesindikiş_görüntüleri(Görüntüler):
dikiş makinesi = cv2.Stitcher.create()
(durum, Stitched_image) = Stitcher.stitch (resimler)
eğer durum == cv2.STITCHER_OK:
geri dönmek dikişli_görüntü
başka:
geri dönmekHiçbiri

Dikiş başarılıysa (işaretiyle gösterildiği gibi) cv2.STITCHER_OK durum kodu), işlev dikişli görüntüyü döndürür. Aksi takdirde geri dönecek Hiçbiri.

Birleştirilmiş Görüntüyü Kırpma

Birleştirilmiş görüntüyü alacak ve kırptıktan sonra geri döndürecek bir işlev oluşturun. İlk olarak, birleştirilmiş görüntüyü gri tonlamaya dönüştürün. Sonra bir ikili görüntü oluşturmak için bir ikili eşik uygulayın. Son olarak, ikili görüntüdeki en büyük konturu bulun ve sınırlayıcı dikdörtgenini hesaplayın.


kesinGörüntüyü kırp(resim):
gri = cv2.cvtColor (resim, cv2.COLOR_BGR2GRAY)
eşik = cv2.threshold (gri, 0, 255, cv2.THRESH_BINARY)[1]
konturlar = cv2.findContours (harman, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (konturlar[0])
cropped_image = resim[y: y + h, x: x + w]
geri dönmek kırpılmış_resim

Birleştirilmiş görüntü, sınırlayıcı dikdörtgen kullanılarak kırpılır.

OpenCV Kullanarak Birleştirilmiş Görüntüyü Önizleme ve Kaydetme

Birleştirilen görüntüyü etkileşimli bir pencerede görüntüleyecek ve onu diske kaydedecek bir işlev oluşturun.


kesinönizleme_ve_save_image(resim, klasör_yolu, klasör_adı):
# Dikişli görüntüyü göster
cv2.namedWindow("Dikişli Görüntü", cv2.WINDOW_NORMAL)
cv2.imshow("Dikişli Görüntü", resim)
cv2.waitKey(0)

# Dikişli görüntüyü kaydedin
output_filename = os.path.join (klasör_yolu, klasör_adı + '_panorama.jpg')
cv2.imwrite (çıktı_dosyaadı, resim)
Yazdır("Klasör için kaydedilen birleştirilmiş görüntü:", Klasör adı)

Panorama görüntüsü, orijinal görüntüleri içeren aynı klasöre kaydedilir.

Programınızın Akışını Kontrol Etme

Programınızın akışını kontrol edecek bir fonksiyon oluşturun. Belirtilen klasördeki tüm görüntüleri yükleyecektir. Yeniden boyutlandırın ve birleştirin. Birleştirilmiş görüntüyü kırpın, önizlemesini görüntüleyin ve ardından diske kaydedin. Klasörde ikiden az görüntü varsa, işlev bir hata mesajı yazdıracak ve herhangi bir birleştirme veya kaydetme işlemi gerçekleştirmeden geri dönecektir.


kesindikiş_klasörü(klasör_yolu, genişlik=800, yükseklik=800):
# Bir klasördeki tüm görüntüleri birleştirin ve sonucu kaydedin.
# Resimleri klasörden yükleyin
resimler = load_images (klasör_yolu)

# Klasörde en az iki resim olup olmadığını kontrol edin
eğer len (resimler) < 2:
Yazdır("Klasörde yeterli resim yok:", klasör yolu)
geri dönmek

# Resimleri yeniden boyutlandırın
resize_images = resize_images (resimler, genişlik, yükseklik)

# Görüntüleri dikin
Stitched_image = Stitch_images (yeniden boyutlandırılmış_images)
eğer dikişli_görüntü dır-dirHiçbiri:
Yazdır("Klasör için birleştirme başarısız oldu:", klasör yolu)
geri dönmek

# Dikişli görüntüyü kırpın
cropped_image = crop_image (stitched_image)

# Dikişli görüntüyü önizleyin ve kaydedin
klasör_adı = os.path.basename (klasör_yolu)
önizleme_ve_save_image (kırpılmış_resim, klasör_yolu, klasör_adı)

Birleştirmek istediğiniz görüntüleri içeren klasör yolunu geçin.

Stitch_folder('örnek_görüntüler') 

Kullandığınız görseller örtüşen özellikler içermelidir. Bu özellikler, belirgin yer işaretlerinden görüntüdeki doku desenlerine kadar her şey olabilir. OpenCV, görüntüleri hizalamak için bunları referans noktası olarak kullanır.

Bu özellikler olmadan OpenCV'nin görüntüleri hizalaması ve kusursuz bir panorama oluşturması zor olacaktır.

Programınızı Test Etme

Panorama görüntüsüne dönüştürmek istediğiniz görüntüleri toplayın. Çakışan özelliklere sahip olduklarından emin olun.

Bu ilk görüntüdeki tepeye bir bakın.

Bu ikinci görüntüde, tepe hafifçe görünüyor. Bu, örtüşen bir özellik oluşturur.

Görüntüleri bir klasöre kaydedin. Klasör yolunu şuraya geçirin: dikiş_klasörü dikiş fonksiyonu. Ve sonra programı çalıştırın.

Program görüntüleri bir araya getirdi ve sahnenin daha geniş bir görünümü ile panoramik bir görüntü oluşturdu. Yukarıdaki panoramik görüntüyü oluşturmak için yukarıda belirtilen GitHub deposunda bulunan dokuz görüntünün kullanıldığını unutmayın.

OpenCV Kullanarak Görüntülerin Manipülasyonu

Panoramalar oluşturmak, OpenCV'nin sunduğu birçok görüntü işleme tekniğinden bazılarını gösterir. Görüntüleri ihtiyaçlarınıza göre değiştirmek için kullanabileceğiniz daha fazla teknik var. Görüntü manipülasyonu içeren daha fazla proje üzerinde çalışmak, genel olarak bilgisayarla görme becerilerinizi geliştirmenize yardımcı olacaktır.