· Hakan Çelik · OpenCV / Kamera Kalibrasyonu · 3 dk okuma
Poz Tahmini

OpenCV Serisi 47/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?
Poz Tahmini
Hedefler
Bu bölümde:
- 3D efektler oluşturmak için calib3d modülünü nasıl kullanacağımızı öğreneceğiz
Temeller
Kamera kalibrasyonu bölümünde kamera matrisini, bozulma katsayılarını vb. bulduk. Bir desen görüntüsü verildiğinde, bu bilgileri kullanarak nesnenin uzaydaki konumunu hesaplayabiliriz: nasıl döndürüldüğü, nasıl yerleştirildiği vb. Düzlemsel bir nesne için Z=0 varsayabiliriz.
Amacımız, satranç tahtasının ilk köşesine 3D koordinat ekseni (X, Y, Z eksenleri) çizmektir. X ekseni mavi, Y ekseni yeşil ve Z ekseni kırmızı renkte olmalıdır.
Önce kalibrasyon sonucundan kamera matrisini ve bozulma katsayılarını yükleyelim:
import numpy as np
import cv2 as cv
import glob
# Önceden kaydedilen veriyi yükle
with np.load('B.npz') as X:
mtx, dist, _, _ = [X[i] for i in ('mtx', 'dist', 'rvecs', 'tvecs')]Şimdi köşeleri ve eksen noktalarını alan bir draw fonksiyonu oluşturalım:
def draw(img, corners, imgpts):
corner = tuple(corners[0].ravel().astype("int32"))
imgpts = imgpts.astype("int32")
img = cv.line(img, corner, tuple(imgpts[0].ravel()), (255, 0, 0), 5)
img = cv.line(img, corner, tuple(imgpts[1].ravel()), (0, 255, 0), 5)
img = cv.line(img, corner, tuple(imgpts[2].ravel()), (0, 0, 255), 5)
return imgŞimdi önceki durumda olduğu gibi, sonlandırma kriterleri, nesne noktaları ve eksen noktaları oluşturuyoruz. Eksen noktaları, ekseni çizmek için 3B uzaydaki noktalardır. 3 uzunluğunda eksen çiziyoruz (satranç karesi boyutunda). X eksenimiz (0,0,0)‘dan (3,0,0)‘a, Y ekseni de benzer. Z ekseni (0,0,0)‘dan (0,0,-3)‘e (negatif kameraya doğru çizildiği anlamına gelir):
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6 * 7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)
axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3)
for fname in glob.glob('left*.jpg'):
img = cv.imread(fname)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, corners = cv.findChessboardCorners(gray, (7, 6), None)
if ret == True:
corners2 = cv.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
# Dönme ve öteleme vektörlerini bul
ret, rvecs, tvecs = cv.solvePnP(objp, corners2, mtx, dist)
# 3D noktaları görüntü düzlemine projelendir
imgpts, jac = cv.projectPoints(axis, rvecs, tvecs, mtx, dist)
img = draw(img, corners2, imgpts)
cv.imshow('img', img)
k = cv.waitKey(0) & 0xFF
if k == ord('s'):
cv.imwrite(fname[:6] + '.png', img)
cv.destroyAllWindows()Her eksen 3 kare uzunluğundadır:

Küp Çizme
Küp çizmek istiyorsanız, draw fonksiyonunu ve eksen noktalarını şu şekilde değiştirin:
def draw(img, corners, imgpts):
imgpts = np.int32(imgpts).reshape(-1, 2)
# zemin katını yeşil renkte çiz
img = cv.drawContours(img, [imgpts[:4]], -1, (0, 255, 0), -3)
# sütunları mavi renkte çiz
for i, j in zip(range(4), range(4, 8)):
img = cv.line(img, tuple(imgpts[i]), tuple(imgpts[j]), (255), 3)
# üst katmanı kırmızı renkte çiz
img = cv.drawContours(img, [imgpts[4:]], -1, (0, 0, 255), 3)
return img
axis = np.float32([[0, 0, 0], [0, 3, 0], [3, 3, 0], [3, 0, 0],
[0, 0, -3], [0, 3, -3], [3, 3, -3], [3, 0, -3]])Sonuç:

Hakan Çelik


