· Hakan Çelik · OpenCV / Kamera Kalibrasyonu · 3 dk okuma
Epipolar Geometri

OpenCV Serisi 48/64
- 1. Boya Fırçası Olarak Fare
- 2. Canny Kenar Algılama
- 3. Görüntü Geçişleri
- 4. Görüntü Piramitleri
- 5. Görüntülerde Aritmetik İşlemler
- 6. Görüntülerle İlgili Temel İşlemler
- 7. Görüntünün Geometrik Dönüşümleri
- 8. Görüntüyü Yumuşatma - ( Smoothing Images )
- 9. Histogramlar
- 10. Konturler ( Contours )
- 11. Morfolojik Dönüşümler
- 12. Opencv Nedir Ve Kurulumu
- 13. Opencv Resim Işlemleri
- 14. Opencv Video Işlemleri
- 15. Opencv'de Çizim Fonksiyonları
- 16. Performans Ölçüm Ve Geliştirme Teknikleri
- 17. Renk Alanlarını Değiştirme
- 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
- 19. Resim Eşikleme
- 20. Şablon Eşleştirme
- 21. Hough Doğru Dönüşümü
- 22. Hough Daire Dönüşümü
- 23. Fourier Dönüşümü
- 24. Histogram Eşitleme
- 25. 2B Histogramlar
- 26. Histogram Geri Projeksiyonu
- 27. Kontur Özellikleri
- 28. Kontur Nitelikleri
- 29. Konturlerle Daha Fazla İşlev
- 30. Kontur Hiyerarşisi
- 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
- 32. Watershed Algoritması ile Görüntü Segmentasyonu
- 33. Özellikleri Anlamak
- 34. Harris Köşe Tespiti
- 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
- 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
- 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
- 38. Köşe Tespiti için FAST Algoritması
- 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
- 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
- 41. Özellik Eşleştirme
- 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
- 43. Meanshift ve Camshift ile Nesne Takibi
- 44. Optik Akış
- 45. Arka Plan Çıkarma
- 46. Kamera Kalibrasyonu
- 47. Poz Tahmini
- 48. Epipolar Geometri
- 49. Stereo Görüntülerden Derinlik Haritası
- 50. k-En Yakın Komşuyu Anlamak
- 51. kNN ile El Yazısı OCR
- 52. SVM'yi Anlamak
- 53. SVM ile El Yazısı OCR
- 54. K-Ortalamalar Kümeleme'yi Anlamak
- 55. OpenCV'de K-Ortalamalar Kümeleme
- 56. Görüntü Gürültü Giderme
- 57. Görüntü Onarımı (Inpainting)
- 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
- 59. Haar Cascade ile Yüz Tespiti
- 60. pip ile OpenCV Kurulumu
- 61. Ubuntu'da OpenCV-Python Kurulumu
- 62. Fedora'da OpenCV-Python Kurulumu
- 63. Windows'ta OpenCV-Python Kurulumu
- 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?
Epipolar Geometri
Hedefler
Bu bölümde:
- Çok görüntülü geometrinin temellerini öğreneceğiz
- Epipol, epilineler, epipolar kısıtlama nedir bunları göreceğiz
Temel Kavramlar
Delikli kamera kullanarak görüntü aldığımızda önemli bir bilgiyi kaybederiz: görüntünün derinliği. 3D’den 2D’ye dönüşüm olduğundan her noktanın kameradan ne kadar uzakta olduğunu bilemeyiz. Bu kameraları kullanarak derinlik bilgisini bulabilir miyiz sorusu ortaya çıkar. Cevap: birden fazla kamera kullanmak.
Aşağıdaki görüntü, aynı sahneyi çeken iki kameraya sahip temel bir kurulumu göstermektedir:

Yalnızca sol kamerayı kullanıyorsak, OX doğrusu üzerindeki her nokta görüntü düzlemindeki aynı noktaya projeksiyonlandığından, görüntüdeki x noktasına karşılık gelen 3D noktayı bulamayız. Ancak sağ görüntüyü de dikkate alırsak, OX doğrusu üzerindeki farklı noktalar sağ düzlemdeki farklı noktalara (x’) projeksiyonlanır. Bu iki görüntüyle doğru 3D noktayı üçgenleyebiliriz.
OX üzerindeki farklı noktaların projeksiyonu sağ düzlemde bir doğru (l’) oluşturur. Buna x noktasına karşılık gelen epilin diyoruz. Başka bir görüntüdeki eşleşen noktayı bulmak için tüm görüntüyü aramaya gerek yoktur; yalnızca epilin boyunca arama yapılır. Buna Epipolar Kısıtlama denir. XOO’ düzlemi ise Epipolar Düzlem olarak adlandırılır.
O ve O’ kamera merkezleridir. Sağ kamera O’nun projeksiyonu, sol görüntüde e noktasında görünür. Buna epipol denir. Tüm epilineler epolden geçer.
Bu epilineleri ve epolleri bulmak için iki malzemeye ihtiyacımız var: Temel Matris (F) ve Temel Matris (E).
Temel Matris (E), ikinci kameranın birinciye göre konumunu tanımlayan öteleme ve dönme hakkında bilgi içerir:

Temel Matris (F), Temel Matrisin aynı bilgisini artı her iki kameranın iç parametrelerini içerir, böylece iki kamerayı piksel koordinatlarında ilişkilendirebiliriz.
Kod
Temel matrisi bulmak için iki görüntü arasında mümkün olduğunca çok eşleşme bulmamız gerekir. Bunun için SIFT tanımlayıcılarını FLANN tabanlı eşleştirici ve oran testiyle kullanırız:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img1 = cv.imread('myleft.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('myright.jpg', cv.IMREAD_GRAYSCALE)
sift = cv.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
pts1 = []
pts2 = []
for i, (m, n) in enumerate(matches):
if m.distance < 0.8 * n.distance:
pts2.append(kp2[m.trainIdx].pt)
pts1.append(kp1[m.queryIdx].pt)
# Temel Matrisi bul
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
F, mask = cv.findFundamentalMat(pts1, pts2, cv.FM_LMEDS)
# Yalnızca inlier noktaları seç
pts1 = pts1[mask.ravel() == 1]
pts2 = pts2[mask.ravel() == 1]Şimdi epilineleri buluyoruz ve görüntülere çiziyoruz:
def drawlines(img1, img2, lines, pts1, pts2):
r, c = img1.shape
img1 = cv.cvtColor(img1, cv.COLOR_GRAY2BGR)
img2 = cv.cvtColor(img2, cv.COLOR_GRAY2BGR)
for r, pt1, pt2 in zip(lines, pts1, pts2):
color = tuple(np.random.randint(0, 255, 3).tolist())
x0, y0 = map(int, [0, -r[2] / r[1]])
x1, y1 = map(int, [c, -(r[2] + r[0] * c) / r[1]])
img1 = cv.line(img1, (x0, y0), (x1, y1), color, 1)
img1 = cv.circle(img1, tuple(pt1), 5, color, -1)
img2 = cv.circle(img2, tuple(pt2), 5, color, -1)
return img1, img2
# İkinci görüntüdeki noktalara karşılık gelen birinci görüntüdeki epilineleri bul
lines1 = cv.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F)
lines1 = lines1.reshape(-1, 3)
img5, img6 = drawlines(img1, img2, lines1, pts1, pts2)
# Birinci görüntüdeki noktalara karşılık gelen ikinci görüntüdeki epilineleri bul
lines2 = cv.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F)
lines2 = lines2.reshape(-1, 3)
img3, img4 = drawlines(img2, img1, lines2, pts2, pts1)
plt.subplot(121), plt.imshow(img5)
plt.subplot(122), plt.imshow(img3)
plt.show()
Hakan Çelik


