· Hakan Çelik · OpenCV / İleri Konular · 3 dk okuma
Konturlerle Daha Fazla İşlev

OpenCV Serisi 29/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?
Konturlerle Daha Fazla İşlev
Hedefler
Bu bölümde öğrenecekleriniz:
- Dışbükeylik kusurları ve bunları nasıl bulacağınız
- Bir noktadan çokgene en kısa mesafeyi bulmak
- Farklı şekilleri eşleştirmek
1. Dışbükeylik Kusurları (Convexity Defects)
Konturlarla ilgili ikinci bölümde dışbükey zarfın ne olduğunu gördük. Nesnenin bu zarftan herhangi bir sapması dışbükeylik kusuru olarak değerlendirilebilir.
OpenCV bunu bulmak için hazır bir fonksiyon sunar: cv2.convexityDefects(). Temel bir çağrı şu şekilde görünür:
hull = cv.convexHull(cnt, returnPoints=False)
defects = cv.convexityDefects(cnt, hull)Not: Dışbükeylik kusurlarını bulmak için dışbükey zarfı ararken
returnPoints=Falsegeçmemiz gerektiğini unutmayın.
Her satırın şu değerleri içerdiği bir dizi döndürür: [başlangıç noktası, bitiş noktası, en uzak nokta, en uzak noktaya yaklaşık mesafe]. Bunu bir görüntü kullanarak görselleştirebiliriz. Başlangıç ve bitiş noktalarını birleştiren bir çizgi çiziyoruz, ardından en uzak noktaya bir daire çiziyoruz. İlk üç döndürülen değerin cnt’nin indeksleri olduğunu unutmayın:
import cv2 as cv
import numpy as np
img = cv.imread('star.jpg')
assert img is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(img_gray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, 2, 1)
cnt = contours[0]
hull = cv.convexHull(cnt, returnPoints=False)
defects = cv.convexityDefects(cnt, hull)
for i in range(defects.shape[0]):
s, e, f, d = defects[i, 0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv.line(img, start, end, [0, 255, 0], 2)
cv.circle(img, far, 5, [0, 0, 255], -1)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()Sonuç:

2. Nokta-Çokgen Testi (Point Polygon Test)
Bu fonksiyon, görüntüdeki bir nokta ile bir kontur arasındaki en kısa mesafeyi bulur. Nokta konturun dışındaysa negatif, içindeyse pozitif, kontur üzerindeyse sıfır döndürür.
Örneğin (50, 50) noktasını şu şekilde kontrol edebiliriz:
dist = cv.pointPolygonTest(cnt, (50, 50), True)Fonksiyonda üçüncü argüman measureDist’tir. True ise işaretli mesafeyi bulur. False ise noktanın konturun içinde mi, dışında mı yoksa üzerinde mi olduğunu bulur (sırasıyla +1, -1, 0 döndürür).
Not: Mesafeyi bulmak istemiyorsanız, üçüncü argümanın False olduğundan emin olun; çünkü bu zaman alıcı bir süreçtir. False yapmak yaklaşık 2-3 kat hızlanma sağlar.
3. Şekil Eşleştirme (Match Shapes)
OpenCV, iki şekli veya iki konturu karşılaştırmamızı sağlayan ve benzerliği gösteren bir ölçüm döndüren cv2.matchShapes() fonksiyonuna sahiptir. Sonuç ne kadar küçükse o kadar iyi bir eşleşmedir. Hu-moment değerlerine göre hesaplanır:
import cv2 as cv
import numpy as np
img1 = cv.imread('star.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('star2.jpg', cv.IMREAD_GRAYSCALE)
assert img1 is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
assert img2 is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
ret, thresh = cv.threshold(img1, 127, 255, 0)
ret, thresh2 = cv.threshold(img2, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, 2, 1)
cnt1 = contours[0]
contours, hierarchy = cv.findContours(thresh2, 2, 1)
cnt2 = contours[0]
ret = cv.matchShapes(cnt1, cnt2, 1, 0.0)
print(ret)Aşağıdaki farklı şekillerle eşleştirmeyi denedim:

Şu sonuçları aldım:
- A görüntüsünü kendi kendisiyle eşleştirme = 0.0
- A görüntüsünü B görüntüsüyle eşleştirme = 0.001946
- A görüntüsünü C görüntüsüyle eşleştirme = 0.326911
Görüldüğü üzere görüntü döndürme bile bu karşılaştırmayı fazla etkilememektedir.
Not: Hu-Momentleri öteleme, döndürme ve ölçeğe göre değişmez yedi momenttir. Yedinci tanesi de yamukluğa (skew) karşı değişmezdir. Bu değerler
cv2.HuMoments()fonksiyonu kullanılarak bulunabilir.
Alıştırmalar
cv2.pointPolygonTest()belgelerini kontrol edin; kırmızı ve mavi renkte güzel bir görüntü bulacaksınız.cv2.matchShapes()kullanarak rakam veya harf görüntülerini karşılaştırın (OCR’ye doğru basit bir adım olacaktır).
Hakan Çelik


