Perşembe, Kasım 22, 2007

OpenCv'ye Giriş 5

OpenCv'ye giriş seri yazılarımızı - Nihayet - bitiriyoruz. Yazı dizimize olan müthiş ilgi - ! sizlik - için teşekkürlerimizi bir borç biliriz

Bu yazımızda video ve web camden görüntü almayı anlatıyoruz. bu işe elin oğlu capture demiş.
Hareketli görüntü dediğimizde zaten görüntünün peş peşe gösterilmesi ile oluşuyor.

* capture için CvCapture tipinde bir işaretçi kullanıyoruz
CvCapture *cap;
* Video Dosyası için cvCaptureFromFile fonksiyonu kullanıyoruz.
CvCapture* cvCaptureFromFile( const char* dosya_adi );
cap=cvCaptureFromFile("video.avi");
* Web Cam için cvCaptureFromCAM fonksiyonu kullanıyoruz.
CvCapture* cvCaptureFromCAM( int index );
index : Kamera No, index olara -1 kullandığımızda hangi kamera varsa onu kullanır.
cap=cvCaptureFromCAM( -1 );
* Capture ile işimiz bittiğinde cvReleaseCapture fonksiyonuyla ile gereken temizlik yapılıyor.
void cvReleaseCapture( CvCapture** capture );
cvReleaseCapture( &cap );
* Alacağımız hareketli görüntünün çeşitli özelliklerini öğrenmek için cvGetCaptureProperty fonksiyonu kullanılır.
double cvGetCaptureProperty( CvCapture* capture, int property_id );
capture : cvCaptureFromFile veya cvCaptureFromCAM ile elde ettiğimiz işaretçi
property_id : Öğrenmek istediğimiz özellik
yani
CV_CAP_PROP_POS_MSEC : Video dosyası için milisaniye cinsinden geçen süre
CV_CAP_PROP_POS_FRAMES : Frame indeksi - 0 ilk -
CV_CAP_PROP_POS_AVI_RATIO : - Video dosyası için gösterilen yerini (0 ile 1 ) gösteren indeks 0 başlangıç 1 bitiş
CV_CAP_PROP_FRAME_WIDTH : Görüntü Eni - X -
CV_CAP_PROP_FRAME_HEIGHT : Görüntü Boyu - Y -
CV_CAP_PROP_FPS : Saniyedeki Görüntü sayısı
CV_CAP_PROP_FOURCC : 4 karekterden oluşan Video Sıkıştırma Format kısaltması - codec - CV_CAP_PROP_FRAME_COUNT - Video dosyasındaki frame sayısı
* Bahsi geçen Özellikleri değiştirmek için cvSetCaptureProperty fonksiyonu kullanılır benzeri şekilde
int cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
property_id : Bir önceki fonksiyonda geçti
value : Değiştirmek istediğimiz özelliğin yeni değeri.
Dikkat edilmesi gereken bir nokta her özelliği istediğiniz gibi değiştiremiyorsunuz. Bazıları Web Cam için bazıları Video dosyası için geçerli detay için OpenCv dökümantasyonuna bakın

* Sıra görüntüyü almaya geldi bu iş için cvQueryFrame fonksiyonunu kullanıyoruz
IplImage* cvQueryFrame( CvCapture* capture );
oda bize daha önce öğrendiğimiz IplImage cinsinden görüntüyü veriyor gerisi artık bize kalmış OpenCv nin imkanlarıyla istediğimizi yapabiliriz...

Örnek Kod için Buyrunuz : Ders5

Deeep Not : Bu serimizi hele şükür bitirdik. Mütevazi bir bilgisayarda aldık ama henüz içini ayarlayamadık, Yeni projelerimiz var, yazılacak pek çok konu da var. Ama Bir taraftan okur-yazamaz olmamız diğer taraftan vakitsizlik engelliyor. Arayan soranların hatrına İnşallah yazmaya başlayacağız.






20 yorum:

Adsız dedi ki...

Cooook uzaklardan sizi takip ediyoruz, siz yazmaya devam edin :)

bluekid dedi ki...

Çoooook uzaklardan takip eden ve talebelerine bir faydamız dokunduysa ne mutlu bize

isimsiz2 dedi ki...

Ben sizden çok şey öğrendim. Aylar önce yazılan yazılar bazen ilaç gibi gelebiliyor. Ellerinize sağlık. :) Her yazıya da yorum yapmak olmuyor ki..

bluekid dedi ki...

Her yazı için yorum beklemiyorum
Ama bazen kendi kendime gelin güvey oluyormuş hissine kapılıyorum. yorum yapılmasada konuyla ilgili fikirlerinizi - mesela mail ile - ulaştırmanız önemli çünkü bir şeylerin gelişmesi ancak bu şekilde oluyor. Yurt dışından daha fazla tepki alıyorum.

Mustafa dedi ki...

yazılarınızı siz yazdıktan çok sonra okudum ve çok faydalandım. Umarım yazmaya devam edersiniz!

teşekkürler

bluekid dedi ki...

bu yazı serinin sonuncusuydu ve bence OpenCvye giriş için yeterli.
Görüntüyü okuyup yazabilir piksellerine erişebilir Video yada kamerdan görüntü alabilir. bazı temel Görütü işleme fonksiyonlarını kullanabilirsiniz...

Adsız dedi ki...

Merhabalar,
capture islemi video sonlandığından dolayı bitince aynı videoyu aynı cvcapture pointerı üzerinden recapture etmeyi nasıl yapabiliriz acaba?
Mesela dugmeye basıyorum capture ediyor pictureBoxTa goruyorum ve video sonlanıyor ve yine dugmeye basınca yine aynı videoyu gormek istiyorum...

bluekid dedi ki...

öncelikle yorumlarınıza isim yazarsanız sevinrim

cvSetCaptureProperty de CV_CAP_PROP_POS_FRAMES ile deneye bilirsiniz mesela

uMt dedi ki...

Yazılarınız çok yardımcı oluyor.Teşekkür ederim. OpenCV'de capture konusuna ufak bir katkıda bulunmak istiyorum. Ders5'i bir türlü çalıştıramadım.Açılan pencerede sadece siyah görüntü oluyordu.

frame'i gösterme döngüsünün içine bu satırı eklediğimde artık cam görüntüsü gelmeye başladı.

if( (cvWaitKey(10) & 255) == 27 ) break;

Açıklamasında yüksek olan pikselleri ANDleyerek düşürdüğünden bahsediyor ancak nasıl yaptığını çok anlamış değilim. İyi Günler İyi Çalışmalar

uMt dedi ki...

1) Değerli Hocam Aybars Uğur'un cevabı

"// breaks if ESC key is pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
// remove higher bits using AND operator
if( (cvWaitKey(10) & 255) == 27 ) break;


Bu klasik bir bilgi. Normal tuşlara ('a', '1' gibi) basıldığında 1 byte bilgi gönderilir klavyeden. Özel tuşlara basıldığında (ESC ve yön tuşları gibi), 2 byte bilgi gönderilir.

Bunları temsil edebilmek için, ilkinde 8 bit, ikincisinde 16 bit kullanılır. Dolayısıyla 16'nın soldaki 8 bitini (higher bits) 0'lamak için 255 ile 0000000011111111 şeklinde AND'lemek gerekir.

Muhtemelen Assembly dersi 2. sınıftan kaldırıldı :)."

bluekid dedi ki...

öncelikle ilginiz ve konuyu takibiniz için teşekkürler
bu yazıları yazdığım zaman henüz Linux da OpenCv kurmamıştım o yüzden programların hiç birini Linux altında denemedim. Ama windows altında çalışıyor. ayrıca OpenCv örnek programlarından camshift demodada
c = cvWaitKey(10);
if( c == 27 )
break;
şeklinde kullanılmış

Acaba bahsettiğiniz problem versiyon farkındanmış gibi geliyor
under OpenCV 0.9.7(linux version)
yazmışsınız

Adsız dedi ki...

merhaba arkadasım,
ilgisizlik demissin ama boyle spesifik bir konu icin de yogun bir ilgi bekleyemezdin zaten :) kaldı ki gorunen o ki ilgi de olmus yorumlardan. yorum yazmadan faydalanan cogunlugu da dusununce oldukca faydalı bir is yaptıgın icin cok tesekkurler. ellerine saglık.
not: bu arada blogspot.com diyarbakır bilmem kacıncı asliye bilmem ne mahkemesi tarafından engellendigi icin mahkeme kararı yazısı bile cıkmadıgı icin linklerin cogunda direk es geciliyor. bunu da goz onunde bulundur.
selamlar....

Adsız dedi ki...

peki MSVCR90.dll bulunamıyor hatasının sebebı ne olabılır ve cozum yolu nedir bir fikriniz var mı ?

bluekid dedi ki...

Bahsettiğiniz DLL'in OpenCv ile alakası yok. Googledan aratırsanız hem dll hemde çözümünü bulabilirsiniz

mguner dedi ki...

S.a çalışmalarınız çok öğretici ve başarılı sizi tebrik ederim. Bende elektronik müh. öğrencisiyim ve bitirme ödevi olarak görüntü işleme ve robot kolun kullanıldığı bir proje yapmak istiyorum. ve opencvsharp kullanmayı düşünüyorum. Bu proje için siz nereden başlamamı önerirsiniz.görüntü işlemeye dair bir bilgim yok.

bluekid dedi ki...

a.s.
burdan bir şey tavsiye etmem mümkün değil, profil sayfasında e-mail adresi var ordan iletişime geçiniz

abdülaziz dedi ki...

merhaba
öncelikle yazdıklarınız opencv ye başlarken çok işime yaradı. cvSetCaptureProperty(capture,CV_CAP_PROP_FPS,20.0);fonksiyonunu kullanarak kameradan 20 fps lik görüntü çekmek istiyorum ama HIGHGUI ERROR: V4L: setting property #5 is not supported ve
HIGHGUI ERROR: V4L: getting property #5 is not supported
hatasını döndürüyor bana bu hatayı nasıl çözebilirim

bluekid dedi ki...

ya kullandığınız versiyon OpenCv yada Video4Linux bu özelliği desteklemiyormuş hatada denen bu
En son versiyonlarını bir deneyin

Mert dedi ki...

birol bey gerçekten bizim gibi görüntü işleme konusunda kendisini geliştirmek istenyenlere yazdığınız dökümanlar ile çok yardımcı oluyorsunuz bunun için size ne kadar teşekkür etsek az ama yazı dizisinin devam gelmemesi üzücü bu konuyla ilgilenen insan sayısı çoğaldı yazı dizinize devam ederseniz tahminum ki ediyor çok ilgi görücektir

Adsız dedi ki...

Pythonla opencv geleceğin iş kolu bence,bilgiye açız daha çok anlat hocam, teşekkürler A.E.O.