MVC2010 OpenCV ile Kenar Algılama (Edge Detection)

Merhaba arkadaşlar bu yazımda  Microsoft Visual Stuido 2010 üzerinde OpenCV kurulumu ve OpenCV kütüphanelerini kullanarak dijital görüntü işleme tekniklerinden popüler olan kenar algılama (edge detection) uygulamasını sizlerle paylaşıcam.

Sobel kenar algılama algoritması görüntü işleme algoritmaları arasında en çok bilinenlerdendir. Verilen herhangi bir resimdeki kenarları elde etmeye yarar. Böylelikle resimler içindeki isteğe yönelik nesneler algılanıp gerekli işlemler yapılabilir. Sobel algoritmasında iki adet konvolusyon kerneli kullanılır. Bunlardan birisi yatay kenarları bulmaya yararken diğeri dikey kenarları bulmaya yarar. Bu kerneller görüntü içerisinde ışık yoğunluk değişiminin ani olduğu yerleri belirlememize yarar. Bir nevi türev yaklaşımıdır. Bu kerneller sırasıyla :

1 0 -1
2 0 -2
1 0 -1
Yatay Sobel Kernel
1 2 1
0 0 0
-1 -2 -1
Dikey Sobel Kernel

şeklindedir. Gradyanlar (kernel uygulamasından sonraki yoğunluk değerleri) herhangi bir pixel için hesaplandıktan sonra büyüklükleri hesaplanarak kenarlar bulunmuş olur. Gradyan büyüklüğü iki gradyanın kareleri toplamının karekökü olarak hesaplanır.

Daha ayrıntılı bilgi için wikipedia üzerinden aşağıdaki linklere tıklayarak ulaşabilirsiniz.

http://en.wikipedia.org/wiki/Edge_detection

http://en.wikipedia.org/wiki/Sobel_operator

http://en.wikipedia.org/wiki/Prewitt_operator

Türkçe konu anlatımı kullanım alanlarını merak eden arkadaşlar için sayın hocamızın ilgili yazılarını okuyabilirsiniz.

http://www.yildiz.edu.tr/~bayram/sgi/saygi.htm

Şimdi Visual studio üzerinde OpenCV kurulumundan bahsedelim.

OPENCV NEDİR ?

OpenCV (Open Source Computer Vision Library) Windows,Linux, Mac OS X, PSP (PlayStation Portable) platformları üzerinde çalışabilen, C diliyle yazılmış, gerçek zamanlı bilgisayarla görme (real time computer vision) ve görüntü işleme (image processing) uygulamaları için kullanılabilen, açık kaynak kodlu bir kütüphane. Intel tarafından geliştirilmiş, Willow Garage tarafından destekleniyor. SourceForge‘dan temin edilebilir. İçerdiği fonksiyonların bir çoğu platform bağımsız olarak çalışır. 2.0 versiyonundan itibaren,  C arayüzüne ek olarak C++ arayüzü de eklenmiş.

Günümüzde, OpenCV içerisindeki bilgisayarla görme ve görüntü işleme algoritmaları kullanılarak;

  • İnsan-Bilgisayar Etkileşimi (Human-Computer Interaction – HCI)
  • Nesne Kimliklendirme, Bölümleme ve Tanıma  (Object Identification, Segmentation and Recognition)
  • Yüz Tanıma (Face Recognition)
  • İşaret Dili Tanıma (Gesture Recognition)
  • Hareket Yakalama, Algılama ve Takibi (Motion Tracking, Ego Motion, Motion Understanding)
  • Çiftli ve Çoklu Kamera Kalibrasyonu ve Derinlik Hesaplama (Stereo and Multi-Camera Calibration and Depth Computation)
  • Hareketli Robot Teknolojileri (Mobile Robotics)

uygulamaları geliştiriliyor.

OpenCV kullanımının anlatıldığı güzel bir kaynak olarak, Gary Bradski ve Adrian Kaehler’in yazdığı Learning OpenCV: Computer Vision with the OpenCV Library kitabı öneriliyor.

Kütüphanenin son versiyonunu Windows veya Unix için temin edebilirsiniz.

OpenCV ile ilgileniyorsanız mutlaka göz atmanız gereken siteleri sıralayayım:

OpenCV, içerdiği işlevler sayesinde, endüstriyel ürünlerden güvenlik ürünlerine, oyun konsollarından mobese kameralarına, yapay zeka ürünlerinden medikal ürünlerine, belge işlemeden astronomiye birçok görüntü işleme uygulamasının geliştirilmesine katkıda bulunuyor.

  1. Opencv kütüphanesini buradan indiriyoruz.OpenCV 2.4.2 ye göre işlemlerimizi yapıyoruz. Şuan 2.4.7 mevcut.
  2. İndirdiğimiz exe dosyasını çalıştırarak dosyaları c:// altında bir konuma açıyoruz. Ben şu şekilde açtım( C:\opencv ). Açtığımızda karşımıza şöyle klasörler gelecek.Image
  3. Açtığımız bu klasörde kullanacağımız dosya yolları şöyle. Bu listeyi şimdi vereyim ilerki adımlarda kullanacağız. Siz klasörleri açtığınız konuma göre tekrar bu yolları ayarlamanız gerekiyor. Ben kendime göre anlatıyorum.

a) Başlık ( include ) Dosyaları için;  C:\opencv\build\include
b) VisualStudio Kütüphane Dosyaları için; C:\opencv\build\x86\vc10\lib
c) VisualStudio DLL Dosyaları için; C:\opencv\build\x86\vc10\bin
d) VisualStudio  TBB için DLL Dosyaları için ; C:\opencv\build\common\tbb\ia32\vc10

  1. Visual Studio yu açıyoruz. File->New->Project yolundan Win32 Console Application projesi açıyoruz (empty seçeneğini işaretleyin).
  2. Solution Explorer altında bulunan projenizin üzerine sağ tıklayarak özellikler (properties) kısmına giriyoruz.( Ya da projeyi yarattıktan sonra özellikler sayfasını açmak için Alt + Enter seçeneğini kullanabilirsiniz.)
  3. Properties sayfasında  VC++ Directories kısmına geliyoruz.
  4. Include Directories bölümüne tıklayarak <Edit…> diyoruz. Açılan sayfada boş bölüme tıklayarakOpenCV başlık dizinini yani 3.madde – a) seçeneğindeki url i yazıyoruz. Ok diyerek kapatıyoruz.
  5. Library Directories bölümüne de aynı yöntemle VisualStudio Kütüphane Dosyaları yolunu yani3.madde – b) seçeneğindeki url i yazıyoruz. Ok diyerek kapatıyoruz.Image
  6. Yine Properties penceresinde Linker->Input yolunu izleyerek açtığımız sayfada
  7. Additional Dependencies bölümüne  şu üç satır kütüphaneyi ekliyoruz.
    opencv_core242d.lib
    opencv_highgui242d.lib
    opencv_imgproc242d.lib Image
  8.  Visual Studio da şimdilik işimiz bitti. Şimdi (Windows 7 için) Bilgisayarıma sağ tıklayarak Özellikleregiriyoruz. Menüden Gelişmiş Sistem Ayarlarını seçiyoruz. Açılan pencerede Gelişmiş tabında Ortam değişkenleri kısmına giriyoruz. Açılan sayfada Sistem değişkenleri bölümünden “Path” değişkenini buluyoruz. Düzenle diyoruz. ve en sonuna giderek bir noktalı virgul (;) koyuyoruz. Sonra da VisualStudio DLL Dosyaları yolunu yazıyoruz (3.madde – c) seçeneği) tekrar noktalı virgül koyup bu seferde VisualStudio  TBB için DLL Dosyaları yolunu yazıyoruz(3.madde -d) seçeneği).Image
  9. Bilgisayarımızı yeniden başlatıyoruz.
  10. Buradan örnek projeyi indirip deneyebilirsiniz. yada aşağıdaki kodu deneyebilirsiniz.
  11. Kodu denemek için öncelikle açtığımız projenin altına (örneğin  bende C:\Users\Kaan\Documents\Visual Studio 2010\Projects\opencv-2\opencv-2 ) altına “01.jpg” isimli resim atın ve kodunuzu çalıştırın.

?View Code CPLUSPLUS

#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <iostream>
using namespace cv;
using namespace std;
Mat image;
int main( int argc, char** argv )
{
    const char* filename = argc == 2 ? argv[1] : (char*)”01.jpg”;
    image = imread(filename, 1);
    if( image.empty() )
    {
        cout << “Couldn’t open image ” << filename << “\n”;
        return 0;
    }
    namedWindow(“Manzara”,CV_WINDOW_NORMAL);
    imshow(“Manzara”, image);
    waitKey();
    return 0;
}

Program çalıştı ise kurulum ve entegrasyon tamamdır. Eğer hata aldıysanız adımları dikkatli bir şekilde tekrarlayın.

Eğer uygulamamız  çalışıyorsa şimdi visual studio üzerinde yeni bir c++ projesi oluşturup aşagıdaki kodumuzu main.cpp içerisine kopyalabilirsiniz. Elinizde sahip oldugunuz .bmp .jpg .jpeg … vs dosyaları proje klasörü içerisine atmayı unutmayınız çünkü src klasörü içerisinden resimi almasını söylüyoruz  programda.

Uygulamamızın kodu burada

#include<iostream>
#include<cmath>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
// Computes the x component of the gradient vector
// at a given point in a image.
// returns gradient in the x direction
int xGradient(Mat image, int x, int y)
{
    return image.at<uchar>(y-1, x-1) +
                2*image.at<uchar>(y, x-1) +
                 image.at<uchar>(y+1, x-1) –
                  image.at<uchar>(y-1, x+1) –
                   2*image.at<uchar>(y, x+1) –
                    image.at<uchar>(y+1, x+1);
}
// Computes the y component of the gradient vector
// at a given point in a image
// returns gradient in the y direction
int yGradient(Mat image, int x, int y)
{
    return image.at<uchar>(y-1, x-1) +
                2*image.at<uchar>(y-1, x) +
                 image.at<uchar>(y-1, x+1) –
                  image.at<uchar>(y+1, x-1) –
                   2*image.at<uchar>(y+1, x) –
                    image.at<uchar>(y+1, x+1);
}
int main()
{
      Mat src, dst;
      int gx, gy, sum;
      // Load an image
      src = imread(“BMP.bmp”, CV_LOAD_IMAGE_GRAYSCALE);
      dst = src.clone();
      if( !src.data )
      { return -1; }
        for(int y = 0; y < src.rows; y++)
            for(int x = 0; x < src.cols; x++)
                dst.at<uchar>(y,x) = 0.0;
        for(int y = 1; y < src.rows – 1; y++){
            for(int x = 1; x < src.cols – 1; x++){
                gx = xGradient(src, x, y);
                gy = yGradient(src, x, y);
                sum = abs(gx) + abs(gy);
                sum = sum > 255 ? 255:sum;
                sum = sum < 0 ? 0 : sum;
                dst.at<uchar>(y,x) = sum;
            }
        }
        namedWindow(“final”);
        imshow(“final”, dst);
        namedWindow(“initial”);
        imshow(“initial”, src);
      waitKey();
    return 0;
}

Src dosyasından seçileceği için proje klasörüne gidip bende  C:\Users\Kaan\Documents\Visual Studio 2010\Projects\opencv-2\opencv-2 olarak görünmekte buraya resmimizi  atıyoruz.

Eğer atmazsanız resimi bu satırlar bulamayacaktır..

// Load an image
      src = imread(“BMP.bmp”, CV_LOAD_IMAGE_GRAYSCALE);
      dst = src.clone();
      if( !src.data )
      { return -1; }

Başka örnek resimleride kendinize referans olarak alıp edge detection işlemi yaptırabilisiniz fakat yukarıda verdiğim satırlarda (BMP.bmp) uzantısına dikkat ederek yazınız ve resimi doğru adrese kopyaladıgınızdan emin olunuz.

Örnek bir çalışma

Image

Örnek BMP.bmp resmi

Image

Umarım yardımcı olabilmişimdir. Herkese kolay gelsin iyi çalışmalar.

Yorum bırakın