OpenCV ile Webcam Görüntüsü İşleme

OpenCV Nedir?

OpenCV, açık kaynaklı bir bilgisayarlı görselleştirme kütüphanesidir. Amacı görüntü işleme ve görselleştirmede sık kullanılan metodların kolaylıkla erişilebilir olmasını sağlamaktadır. Yazımızda kullandığımız OpenCV 2.2 ile webcam görüntüsü işlerken bu kolaylığı farkedeceğiz.Movie Rings (2017)

Webcam görüntüsünü alacağım derseniz bir yolu da DirectShow kullanmaktır ki bu yol uzun ince bir yoldur, bkz. DirectShow Webcam

Webcam Görüntüsünü Almak

Yüklü ve windows tarafından tanınmış olan webcaminizden OpenCV kullanarak görüntü almak için yazmanız gereken kod sadece tek bir satırdır.

	CvCapture* capture = 0;
	capture = cvCaptureFromCAM(0);
	IplImage* videoFrame = NULL;

	videoFrame = cvQueryFrame(capture); // kameradan görüntü alınır

Gerekenler

  • VS 2010 ve C/C++ Bilgisi
  • OpenCV 2.2 Kurulumu
  • OpenCV’yi kendiniz patchlemek isterseniz:
    • CMake, OpenCV’yi patchledikten sonra build etmek için.
    • OpenCV 2.2 Windows webcam patchi: İngilizce
  • Patchli dll ve libleri indirmek isterseniz:

İzlenen Yol

OpenCV 2.2 Patch

OpenCV 2.2 sürümünde mevcut olan bir bug, windows makinalarda görüntü alınmasına engel olmaktadır. Bu bugın varlığını keşfedinceye kadar bilgisayarımdan ve kameramdan şüphe etmiştim, neyseki şüphelerim yersizmiş. Patch deyince gözünüz korkmasın, sadece tek bir dosyada iki satır değişiklik yapmak gerekiyor. Bu satırlar için bkz. OpenCV 2.2 patch.

Yok ben dosyalarımı patchli kullanırım derseniz İndirmeler bölümünden OpenCV patch dosyasını indirip içindeki dll dosyalarını c:\opencv2.2\bin içerisinde, lib dosyalarını da c.\opencv2.2\lib dizinine oradaki dosyaların üzerine yazarak kopyalayabilirsiniz.

Visual Studio Projesi

  • Empty Win32 Console Project yaratarak yolculuğumuza başlıyoruz.
  • Projemizin özellik sayfasında VC++ Directories’de includeları ekliyoruz:
    C:\OpenCV2.2\include
  • Projemizin özellik sayfasında VC++ Directories’de libraryleri ekliyoruz:
    C:\OpenCV2.2\lib
  • Kullanacağımız kütüphane dosyalarını Linker->Input->Additional Dependencies’e ekliyoruz.
    opencv_core220.lib
    opencv_highgui220.lib
    opencv_imgproc220.lib
  • Yaratacağımız main.h dosyasına içeriği ekliyoruz:
    #pragma once // Header dosyasına birden fazla referans olsa bile sadece 1 kere işlensin.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "opencv2\opencv.hpp"
    
  • Yaratacağımız main.cpp dosyasına webcamden capture edip görüntüyü negatif yaparak ekranda göstermeye yarayacak aşağıdaki kodu ekliyoruz.
    
    #include "main.h" // tüm başlıklarımızı ve tanımlamalarımızı içeren başlık dosyası.
    
    int main( int argc, char** argv )
    {
    	int key = -1;
    
    	CvCapture* capture = 0;
    
    	// İlk tanımlı kameranın tutacağını al. (tutacak = handle).
    	capture = cvCaptureFromCAM( 0 );
    	if( !capture )
    	{
    		// Tutacak geçersiz ise programdan çık.
    		fprintf( stderr, "Kamera tutacağı edinilemedi...\n" ); // bilgilendiiir.
    		exit( EXIT_FAILURE );
    	}
    
    	// Görüntü için pointer.
    	IplImage* videoFrame = NULL; 
    
    	// ilk kareyi yakala.
    	videoFrame = cvQueryFrame( capture ); 
    
    	if( !videoFrame )
    	{
    		// Kare yakalanamadı, programdan çık.
    		printf( "Kare yakalanamadı...\n" );
    		exit( EXIT_FAILURE );
    	}
    
    	// MainVideo adında bir gösterim penceresi yarat.
    	cvNamedWindow( "MainVideo", 1 );
    
    	// q tuşuna basana kadar dön.
    	while( key != 'q' )
    	{
    		// Bir kare al.
    		videoFrame = cvQueryFrame( capture );
    
    		// Kare geçersiz ise loop biter.
    		if( !videoFrame )
    			break;
    
    		// Karenin tüm pixellerini ters çevir, negatif resim efekti.
    		// Not: Görüntü tipinin BGR olduğu varsayılmıştır. Normalde kontrol edilmelidir.
    		for( int i=0; i < videoFrame->imageSize; i++ )
    		{
    			videoFrame->imageData[i] = 255 - videoFrame->imageData[i];
    		}
    
    		// Negatif görüntüyü pencerede göster.
    		cvShowImage( "MainVideo", videoFrame );
    
    		key = cvWaitKey( 10 ); // 10ms tuş için bekle.
    	}
    
    	cvDestroyAllWindows(); // yarattığımız pencereyi yokeder.
    
    	cvReleaseCapture( &amp;amp;amp;amp;amp;amp;amp;capture ); // Kameranın tutacağını bırakır.
    
    	exit( EXIT_SUCCESS );
    }
    
    

Gerçek Zamanlı Webcam Negatifi

İndirmeler

Dosyaları açabilmek için farklı kaydederek uzantısını 7z yapınız.
Patchlenmiş OpenCV dosyaları: OpenCV2.2 webcam patch
Örnek Proje Kaynakları: HelloOpenCV