· Hakan Çelik · OpenCV / Python Bağlayıcıları · 3 dk okuma
OpenCV-Python Bağlayıcıları Nasıl Çalışır?

OpenCV Serisi 64/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?
OpenCV-Python Bağlayıcıları Nasıl Çalışır?
Hedefler
- OpenCV-Python bağlayıcılarının nasıl oluşturulduğunu öğreneceğiz
- Yeni OpenCV modüllerinin Python’a nasıl genişletileceğini göreceğiz
OpenCV-Python Bağlayıcıları Nasıl Oluşturulur?
OpenCV’de tüm algoritmalar C++ ile uygulanır. Ancak bu algoritmalar Python, Java gibi farklı dillerden kullanılabilir. Bunu mümkün kılan bağlayıcı üreteçleridir (bindings generators). Bu üreteçler C++ ile Python arasında bir köprü oluşturarak kullanıcıların Python’dan C++ fonksiyonlarını çağırmasına olanak tanır.
OpenCV, tüm fonksiyonlar için sarmalayıcı (wrapper) fonksiyonları manuel olarak yazmak yerine bunu daha akıllıca yapar: modules/python/src2/ altındaki Python betikleri aracılığıyla C++ başlıklarından otomatik olarak üretir.
Sürecin Adımları
modules/python/CMakeFiles.txt— Python’a genişletilecek modülleri kontrol eden CMake betiğidir. Tüm modülleri otomatik olarak kontrol eder ve başlık dosyalarını toplar.modules/python/src2/gen2.py— Python bağlayıcı üreteci betiğidir.hdr_parser.py’yi çağırır.modules/python/src2/hdr_parser.py— Başlık ayrıştırıcısıdır. Başlık dosyasını Python listelerine ayırır; her liste belirli bir fonksiyon, sınıf vb. hakkındaki tüm ayrıntıları içerir (fonksiyon adı, dönüş tipi, giriş argümanları, argüman tipleri vb.).
Başlık ayrıştırıcısı tüm fonksiyon ve sınıfları değil, yalnızca geliştiricinin Python’a aktarmak için işaretlediklerini ayrıştırır.
Yeni Modülleri Python’a Genişletme
Fonksiyon Genişletme: CV_EXPORTS_W
CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );Başlık ayrıştırıcısı, InputArray, OutputArray gibi anahtar kelimelerden giriş ve çıkış argümanlarını anlayabilir.
Bazen C++‘ta referansla geçirilen parametreler giriş, çıkış veya her ikisi olarak kullanılabilir. CV_OUT ve CV_IN_OUT makroları bunu açıkça belirtir:
CV_EXPORTS_W void minEnclosingCircle( InputArray points,
CV_OUT Point2f& center, CV_OUT float& radius );Sınıf Genişletme: CV_EXPORTS_W ve CV_WRAP
Büyük sınıflar için CV_EXPORTS_W kullanılır. Sınıf yöntemlerini genişletmek için CV_WRAP, sınıf alanları için CV_PROP kullanılır:
class CV_EXPORTS_W CLAHE : public Algorithm
{
public:
CV_WRAP virtual void apply(InputArray src, OutputArray dst) = 0;
CV_WRAP virtual void setClipLimit(double clipLimit) = 0;
CV_WRAP virtual double getClipLimit() const = 0;
};Aşırı Yüklenmiş Fonksiyonlar: CV_EXPORTS_AS
Aşırı yüklenmiş fonksiyonlar yeni isimlerle genişletilir:
CV_EXPORTS_W void integral( InputArray src, OutputArray sum, int sdepth = -1 );
CV_EXPORTS_AS(integral2) void integral( InputArray src, OutputArray sum,
OutputArray sqsum, int sdepth = -1, int sqdepth = -1 );
CV_EXPORTS_AS(integral3) void integral( InputArray src, OutputArray sum,
OutputArray sqsum, OutputArray tilted,
int sdepth = -1, int sqdepth = -1 );Küçük Struct’lar: CV_EXPORTS_W_SIMPLE
KeyPoint, DMatch gibi küçük struct’lar CV_EXPORTS_W_SIMPLE ile genişletilir. Yöntemleri için CV_WRAP, alanları için CV_PROP_RW kullanılır:
class CV_EXPORTS_W_SIMPLE DMatch
{
public:
CV_WRAP DMatch();
CV_WRAP DMatch(int _queryIdx, int _trainIdx, float _distance);
CV_PROP_RW int queryIdx;
CV_PROP_RW int trainIdx;
CV_PROP_RW int imgIdx;
CV_PROP_RW float distance;
};Python Sözlüğüne Dışa Aktarma: CV_EXPORTS_W_MAP
Bazı küçük struct’lar Python yerel sözlüğüne aktarılabilir. Moments() buna bir örnektir:
class CV_EXPORTS_W_MAP Moments
{
public:
CV_PROP_RW double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
CV_PROP_RW double mu20, mu11, mu02, mu30, mu21, mu12, mu03;
CV_PROP_RW double nu20, nu11, nu02, nu30, nu21, nu12, nu03;
};Özet
Temel işlemler şu şekilde gerçekleşir: Python’dan res = equalizeHist(img1, img2) çağrıldığında iki numpy dizisi geçirilir. Bu numpy dizileri cv::Mat’a dönüştürülür, C++‘daki equalizeHist() fonksiyonu çağrılır ve sonuç tekrar numpy dizisine dönüştürülür. Bu sayede neredeyse tüm işlemler C++‘ta yapılır ve C++ ile benzer bir hız elde edilir.
Hakan Çelik


