OpenCV Nedir?

OpenCV Nedir? opencv

OpenCV Nedir? sorusuna derinlemesine bir mühendislik perspektifiyle cevap aramadan önce, bu kütüphanenin zemin hazırladığı temel disiplin olan bilgisayarla görü (computer vision) kavramını teknik olarak analiz edelim.

Bilgisayarla Görü (Computer Vision) Nedir?

Bilgisayarla görü; dijital görüntülerin (görsel ve videoların) donanımsal düzeyde nasıl temsil edildiğini, saklandığını ve bu iki boyutlu piksel matrislerinden anlamlı, yüksek düzeyli anlamsal bilgilerin matematiksel algoritmalar vasıtasıyla nasıl çıkarıldığını inceleyen bir mühendislik disiplinidir. Bilgisayarla görü, modern Yapay Zeka sistemlerinin en kritik alt alanlarından biridir. Sürücüsüz otonom araçlar (Tesla Autopilot, Waymo), biyometrik yüz tanıma sistemleri, endüstriyel kalite kontrol robotları, tıbbi görüntüleme (tümör tespiti) ve fotoğraf filtreleme uygulamalarının tamamı bilgisayarla görü temelleri üzerine kuruludur.

Matematiksel olarak, tek kanallı (gri tonlamalı / grayscale) bir görüntü iki boyutlu ayrık bir fonksiyon olarak tanımlanır:

    \[I(x, y) \in [0, L-1] \quad \text{burada} \quad x \in [0, W-1], \ y \in [0, H-1]\]

Burada W görüntünün genişliğini, H yüksekliğini ve L ise piksellerin alabileceği maksimum yoğunluk seviyesini (8-bitlik bir görüntü için L = 256, yoğunluk aralığı [0, 255]) ifade eder. Üç kanallı renkli bir görüntü (RGB veya BGR) ise üç farklı renk matrisinin üst üste binmesiyle oluşan üç boyutlu bir tensördür: I(x, y, c) \in [0, 255] (c \in \{0, 1, 2\}).

OpenCV Nedir?

OpenCV (Open Source Computer Vision Library); gerçek zamanlı bilgisayarla görü, makine öğrenimi ve görüntü işleme uygulamaları geliştirmek amacıyla tasarlanmış, açık kaynak kodlu ve çapraz platform destekli dünya standardı bir kütüphanedir. İlk olarak 1999 yılında Intel bünyesinde Gary Bradski tarafından başlatılan proje, günümüzde çok geniş bir topluluk tarafından aktif olarak geliştirilmektedir.

Büyük oranda C++ ile yazılmış olan OpenCV, arka planda Intel Integrated Performance Primitives (IPP) ve OpenCL entegrasyonu sayesinde son derece yüksek çalışma performansına sahiptir. İçerisinde görüntü önişleme, nesne tespiti, kamera kalibrasyonu, hareket analizi, derin öğrenme model çıkarımı (DNN modülü) ve 3D rekonstrüksiyon gibi alanlarda optimize edilmiş 2500‘den fazla algoritma barındırır. Google, Amazon, Microsoft, Toyota ve Intel gibi teknoloji devleri, bilgisayarlı görü projelerinin omurgasında OpenCV kütüphanesini kullanmaktadır. Kütüphane; C++, Python, Java ve MATLAB dillerine yerel arayüzler sunarken; Windows, Linux, macOS, iOS ve Android işletim sistemlerinde sorunsuz çalışmaktadır.

OpenCV Nedir?
OpenCV Logosu ve Çapraz Platform Mimarisi

OpenCV Nasıl Kurulur?

OpenCV kütüphanesini sisteminize dahil etmek oldukça basittir. Hangi işletim sistemini kullandığınıza bağlı olarak aşağıdaki yöntemleri uygulayabilirsiniz:

1. Debian / Ubuntu Linux Üzerinde Kurulum

Linux dağıtımlarında paket yöneticisi (apt) aracılığıyla Python 3 bağlayıcıları ile birlikte kurmak için şu komutu çalıştırabilirsiniz:

sudo apt update
sudo apt install python3-opencv -y

2. macOS Üzerinde Derleyerek Kurulum

macOS platformunda OpenCV’nin tüm ek modüllerini (non-free patentli algoritmalar dahil) aktifleştirip C++ projenizde doğrudan kullanmak istiyorsanız, CMake aracıyla kaynak koddan derlemeniz tavsiye edilir. İlk olarak Homebrew ile CMake aracını kurun:

brew install cmake

Ardından OpenCV ana deposunu ve genişletilmiş algoritmaları barındıran opencv_contrib deposunu GitHub üzerinden çekerek derleme aşamasına geçin:

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
mkdir build && cd build
cmake -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
make -j(sysctl -n hw.ncpu) sudo make install</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">3. Python (pip) ile Platform Bağımsız Kurulum</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> Geliştirme ortamınızda Python kullanıyorsanız, en hızlı kurulum yöntemi PyPI depoları üzerinden <code>pip</code> kullanmaktır: <!-- /wp:paragraph -->  <!-- wp:code --> <pre class="wp-block-code"><code>pip install opencv-python opencv-contrib-python</code></pre> <!-- /wp:code -->  <!-- wp:heading {"className":"wp-block-heading"} --> <h2 class="wp-block-heading">Temel OpenCV Algoritmaları ve Kod Örnekleri</h2> <!-- /wp:heading -->  <!-- wp:paragraph --> OpenCV ile pratik görüntü işleme işlemlerini adım adım kodlayalım. Tüm örneklerde Python dilindeki <code>cv2</code> modülü kullanılmıştır. <!-- /wp:paragraph -->  <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Okuma ve Ekranda Gösterme</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> Yerel diskte bulunan bir görüntüyü okuyup pencerede render etmek için <code>cv2.imread()</code> ve <code>cv2.imshow()</code> fonksiyonları kullanılır: <!-- /wp:paragraph -->  <!-- wp:code --> <pre class="wp-block-code"><code>import cv2  # Görüntüyü varsayılan BGR renk uzayında yükler img = cv2.imread('devreyakan.jpg')  # Pencere oluşturup resmi gösterir cv2.imshow('OutputImage', img) cv2.waitKey(0) # Kullanıcı bir tuşa basana kadar bekler cv2.destroyAllWindows()</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Boyutları ve Şekil Matrisini Okuma</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> OpenCV pikselleri arka planda NumPy matrisi olarak tutar. Dolayısıyla görüntünün çözünürlük ve kanal bilgilerine <code>shape</code> niteliği üzerinden erişilebilir: <!-- /wp:paragraph -->  <!-- wp:code --> <pre class="wp-block-code"><code>img = cv2.imread('devreyakan.jpg')  # shape niteliği (Yükseklik, Genişlik, Kanal Sayısı) tuple döndürür print("Matris Boyutları:", img.shape)   height = img.shape[0] width = img.shape[1] channels = img.shape[2] if len(img.shape) > 2 else 1  print(f"Yükseklik: {height} piksel") print(f"Genişlik: {width} piksel") print(f"Kanal Sayısı (BGR): {channels}")</code></pre> <!-- /wp:code -->  <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Döndürme ve 2D Affine Dönüşüm Matematiği</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> Piksellerin belirli bir(\theta)açısıyla döndürülmesi işlemi, iki boyutlu afin dönüşüm matrisi (M) ile görüntünün çarpılması prensibine dayanır. Dönüşüm matrisiM

    şu şekilde tanımlanır: <!-- /wp:paragraph --> <!-- wp:paragraph --> <span class="ql-right-eqno">   </span><span class="ql-left-eqno">   </span><img src="https://devreyakan.com/wp-content/ql-cache/quicklatex.com-424dc1707a56aa782f9a64d7f6c45bb2_l3.png" height="42" width="272" class="ql-img-displayed-equation quicklatex-auto-format" alt="\[M = \begin{bmatrix} \alpha & \beta & (1-\alpha) \cdot x_c - \beta \cdot y_c \\ -\beta & \alpha & \beta \cdot x_c + (1-\alpha) \cdot y_c \end{bmatrix}\]" title="Rendered by QuickLaTeX.com"/> <!-- /wp:paragraph --> <!-- wp:paragraph --> Burada

\alpha = s \cdot \cos\theta,\beta = s \cdot \sin\theta,sölçeklendirme faktörü ve(x_c, y_c)ise dönüşüm merkezidir. Her bir(x, y)piksel koordinatı yeni koordinata (x', y'

    ) haritalanır: <!-- /wp:paragraph --> <!-- wp:paragraph --> <span class="ql-right-eqno">   </span><span class="ql-left-eqno">   </span><img src="https://devreyakan.com/wp-content/ql-cache/quicklatex.com-e6d460931df8c376e85eac92208846bb_l3.png" height="64" width="103" class="ql-img-displayed-equation quicklatex-auto-format" alt="\[\begin{bmatrix} x' \\ y' \end{bmatrix} = M \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}\]" title="Rendered by QuickLaTeX.com"/> <!-- /wp:paragraph --> <!-- wp:paragraph --> OpenCV ile bu işlemi gerçekleştiren kod yapısı şöyledir: <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>img = cv2.imread("devreyakan.jpg") height, width = img.shape[:2] # Dönüşüm merkezini ve parametreleri tanımla: 70 derece dönüş, 0.5 kat küçültme rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), 70, 0.5) # Affine dönüşümü uygula rotated_image = cv2.warpAffine(img, rotation_matrix, (width, height)) cv2.imshow('Rotated Image', rotated_image) cv2.waitKey(0)</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Çözünürlüğü ve İşlem Hızı Optimizasyonu</h3> <!-- /wp:heading --> <!-- wp:paragraph --> Gerçek zamanlı video işleme sistemlerinde performans yönetimi kritik bir faktördür. Piksel tabanlı görüntü analizi karmaşık algoritmalar içerdiğinde işlem süresi hızlı bir şekilde artar. Örneğin, Full HD (

1920 \times 1080) çözünürlüğünde 3 kanallı renkli bir görüntünün30 \text{ FPS}

    hızında işlenmesi durumunda saniyelik veri bant genişliği şu şekilde hesaplanır: <!-- /wp:paragraph --> <!-- wp:paragraph --> <span class="ql-right-eqno">   </span><span class="ql-left-eqno">   </span><img src="https://devreyakan.com/wp-content/ql-cache/quicklatex.com-3749d7b67fb59bb52eb5b7c3bc56e8f3_l3.png" height="19" width="595" class="ql-img-displayed-equation quicklatex-auto-format" alt="\[\text{Bant Genişliği} = 1920 \times 1080 \times 3 \text{ byte} \times 30 \text{ frame/s} \approx 186.6 \text{ MB/s} \approx 1.49 \text{ Gbps}\]" title="Rendered by QuickLaTeX.com"/> <!-- /wp:paragraph --> <!-- wp:paragraph --> Özellikle gömülü sistemlerde (Örn: Raspberry Pi, BeagleBone) bu büyüklükte bir veriyi gerçek zamanlı işlemek ciddi darboğazlara neden olur ve karesel gecikmelere (frame drop) yol açar. Bu nedenle pratik projelerde şu optimizasyon teknikleri uygulanır: <!-- /wp:paragraph --> <!-- wp:list --> <ul class="wp-block-list"><!-- wp:list-item --> <li><strong>Çözünürlük Düşürme (Resizing):</strong> İşlem öncesinde görüntü <code>cv2.resize()</code> ile daha düşük boyutlara (Örn:

320 \times 240veya640 \times 480) indirgenir. Hız öncelikli durumlarda interpolasyon yöntemi olarak en yakın komşu (nearest-neighbor) interpolasyonu seçilmelidir.</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><strong>Renk Uzayı Dönüşümü:</strong> Renk bilgisi kritik değilse (Örn: kenar bulma veya şerit takibi), 3 kanallı BGR görüntüsü <code>cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)</code> fonksiyonuyla tek kanallı gri tonlamaya dönüştürülerek bellek transfer yükü 3 kat düşürülür.</li> <!-- /wp:list-item -->  <!-- wp:list-item --> <li><strong>Donanım Hızlandırma (Hardware Acceleration):</strong> Derin öğrenme çıkarımlarında OpenCV DNN modülünün CUDA veya OpenCL backend'leri aktif hale getirilerek pikseller CPU yerine GPU üzerinde paralel olarak işlenir.</li> <!-- /wp:list-item --></ul> <!-- /wp:list -->  <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Bulandırma (Spatial Convolution) Matematiği</h3> <!-- /wp:heading -->  <!-- wp:paragraph --> Görüntü üzerindeki gürültüleri azaltmak veya yumuşatmak için iki boyutlu konvolüsyon (2D convolution) uygulanır. Giriş görüntüsüI, seçilen bir kernel (filtre matrisi)K

    ile taranır: <!-- /wp:paragraph --> <!-- wp:paragraph --> <span class="ql-right-eqno">   </span><span class="ql-left-eqno">   </span><img src="https://devreyakan.com/wp-content/ql-cache/quicklatex.com-fadfec4ec85aa01f8a341a20b2d5d259_l3.png" height="56" width="363" class="ql-img-displayed-equation quicklatex-auto-format" alt="\[I_{\text{filtered}}(x, y) = \sum_{i=-k}^{k} \sum_{j=-k}^{k} I(x-i, y-j) \cdot K(i, j)\]" title="Rendered by QuickLaTeX.com"/> <!-- /wp:paragraph --> <!-- wp:paragraph --> Burada

(2k+1) \times (2k+1)boyutlarında bir kernel penceresi piksellerin üzerinde gezdirilerek yeni piksel değeri hesaplanır. Örneğin7 \times 7

    boyutunda bir ortalama alma (box filter) filtresinin kernel yapısı şöyledir: <!-- /wp:paragraph --> <!-- wp:paragraph --> <span class="ql-right-eqno">   </span><span class="ql-left-eqno">   </span><img src="https://devreyakan.com/wp-content/ql-cache/quicklatex.com-433e42ecbb6647062d9643049309ffba_l3.png" height="97" width="212" class="ql-img-displayed-equation quicklatex-auto-format" alt="\[K = \frac{1}{49} \begin{bmatrix} 1 & 1 & \dots & 1 \\ 1 & 1 & \dots & 1 \\ \vdots & \vdots & \ddots & \vdots \\ 1 & 1 & \dots & 1 \end{bmatrix}_{7 \times 7}\]" title="Rendered by QuickLaTeX.com"/> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>import numpy as np img = cv2.imread("devreyakan.jpg") # 7x7 boyutunda ortalama kernel oluştur kernel = np.ones((7, 7), np.float32) / 49 # 2D konvolüsyon filtresini görüntüye uygula blurred = cv2.filter2D(img, -1, kernel) cv2.imshow('Blurred Image', blurred) cv2.waitKey(0)</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Piramidi (pyrDown / pyrUp)</h3> <!-- /wp:heading --> <!-- wp:paragraph --> Görüntü piramitleri, çözünürlük ölçeklemesinde piksellerin kaybolmasını engellemek için Gaussian filtreleme ile altörneklemeyi (subsampling) bir arada yürütür: <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>img = cv2.imread("devreyakan.jpg") # Çözünürlüğü yarıya indirir ve Gaussian yumuşatma uygular smaller = cv2.pyrDown(img) # Çözünürlüğü iki katına çıkarır larger = cv2.pyrUp(img) cv2.imshow('Original', img) cv2.imshow('Smaller', smaller) cv2.imshow('Larger', larger) cv2.waitKey(0)</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Görüntü Kırpma (Slicing)</h3> <!-- /wp:heading --> <!-- wp:paragraph --> NumPy matris dilimleme (slicing) yöntemiyle görüntünün belirli bir Bölge İlgi Alanı (ROI - Region of Interest) kesilip alınabilir: <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>img = cv2.imread("devreyakan.jpg") height, width = img.shape[:2] # Görüntünün merkez alanından %50'lik bölgeyi kırp start_row, start_col = int(height * 0.15), int(width * 0.15) end_row, end_col = int(height * 0.65), int(width * 0.65) cropped = img[start_row:end_row, start_col:end_col] cv2.imshow('Cropped ROI', cropped) cv2.waitKey(0)</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3,"className":"wp-block-heading"} --> <h3 class="wp-block-heading">Kenar Tespiti ve Canny Algoritması</h3> <!-- /wp:heading --> <!-- wp:paragraph --> Kenar bulma işlemlerinde en gelişmiş yöntemlerden biri <strong>Canny Kenar Algoritmasıdır</strong>. Algoritma temel olarak 4 aşamadan oluşur: <!-- /wp:paragraph --> <!-- wp:list --> <ul class="wp-block-list"><!-- wp:list-item --> <li><strong>Gürültü Azaltma:</strong> Görüntüye Gaussian filtresi uygulanarak yüksek frekanslı gürültüler elenir.</li> <!-- /wp:list-item --> <!-- wp:list-item --> <li><strong>Yoğunluk Gradyanlarının Hesaplanması:</strong> Sobel filtreleri kullanılarak yatay (

G_x) ve dikey (G_y) gradyanlar hesaplanır. Gradyan büyüklüğü (|G|) ve yönü (\theta$) elde edilir:

    \[|G| = \sqrt{G_x^2 + G_y^2}, \quad \theta = \arctan2(G_y, G_x)\]


  • Maksimum Olmayanları Bastırma (Non-maximum Suppression): Pikseller taranarak yerel maksimum olmayan kenar pikselleri inceltilir ve zayıf çizgiler elenir.
  • Histerezis Eşikleme (Hysteresis Thresholding): İki farklı eşik değeri (alt ve üst) seçilerek güçlü kenarlar doğrudan alınır, alt ve üst eşik arasında kalan pikseller ise güçlü bir kenara bağlı ise kenar kabul edilir; aksi takdirde elenir.
  • img = cv2.imread("devreyakan.jpg", cv2.IMREAD_GRAYSCALE)
    
    # Canny algoritması: Alt eşik = 20, Üst eşik = 170
    canny_edges = cv2.Canny(img, 20, 170)
    
    cv2.imshow('Canny Edges', canny_edges)
    cv2.waitKey(0)

    Kameradan Gerçek Zamanlı Video Akışı Alma

    Kamera donanımına veya RTSP (Real-Time Streaming Protocol) yayınlarına bağlanarak video akışından kare kare görüntü okumak için cv2.VideoCapture() sınıfı kullanılır:

    # 0, varsayılan sistem web kamerasını temsil eder
    cap = cv2.VideoCapture(0)
    
    if not cap.isOpened():
        print("Hata: Kamera kaynağına bağlanılamadı.")
        exit()
    
    while True:
        # Kamera sensöründen tek bir frame oku
        ret, frame = cap.read()
        
        if not ret:
            print("Hata: Görüntü okunamıyor.")
            break
            
        # Görüntüyü gerçek zamanlı pencerede render et
        cv2.imshow('Live Stream', frame)
        
        # 'q' tuşuna basıldığında döngüden çık
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # Donanım kaynaklarını serbest bırak
    cap.release()
    cv2.destroyAllWindows()

    OpenCV'nin derinliklerine ve gerçek zamanlı uygulamalarına adım attıktan sonra, bu kütüphaneyi tek kartlı bilgisayarlarla birleştirerek pratik donanım projeleri geliştirmek isterseniz Raspberry Pi ile WSPR Beacon (İşaretçi) başlıklı mühendislik rehberimizi inceleyebilirsiniz.

    Resmi opencv GitHub reposuna buradan ulaşabilirsiniz.

    Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.