Sayfalar

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:

  1. Adsız4:07 ÖS

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

    YanıtlaSil
  2. Çoooook uzaklardan takip eden ve talebelerine bir faydamız dokunduysa ne mutlu bize

    YanıtlaSil
  3. Adsız10:08 ÖS

    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..

    YanıtlaSil
  4. 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.

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

    teşekkürler

    YanıtlaSil
  6. 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...

    YanıtlaSil
  7. Adsız2:29 ÖS

    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...

    YanıtlaSil
  8. öncelikle yorumlarınıza isim yazarsanız sevinrim

    cvSetCaptureProperty de CV_CAP_PROP_POS_FRAMES ile deneye bilirsiniz mesela

    YanıtlaSil
  9. 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

    YanıtlaSil
  10. 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ı :)."

    YanıtlaSil
  11. ö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

    YanıtlaSil
  12. Adsız11:52 ÖS

    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....

    YanıtlaSil
  13. Adsız1:53 ÖS

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

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

    YanıtlaSil
  15. mguner12:13 ÖS

    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.

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

    YanıtlaSil
  17. abdülaziz4:55 ÖS

    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

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

    YanıtlaSil
  19. 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

    YanıtlaSil
  20. Adsız2:16 ÖS

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

    YanıtlaSil