2016-03-30 27 views
3

benim kamerası, Logitech C270 video kareleri yakalamak için OpenCV 3.1 ve Python 2.7 kullanıyorum. Ayrıca kameramın özelliklerini ayarlamak için video4linux2 (v4l2) kullanıyorum ama bu birkaç soruna yol açtı. İşletim sistemim Ubuntu 15.04.OpenCV'nin desteklemediği, ancak v4l2 API'sinin yaptığı web kamerası özelliklerini nasıl değiştirebilirim?

Değiştirmeye çalıştığım belirli özellik absolute_exposure'dur.

Ben komutuyla v4l2-ctl --set-ctrl exposure_absolute=40 ile, terminal aracılığıyla elle V4L2 API kullanarak bunu değiştirmek mümkün, ve o güzel çalışıyor ama bu görev için bir senaryo yazmaya gerek.

OpenCV'nin set(cv2.CAP_PROP_EXPOSURE, 20) kullanımı "VIDEOIO ERROR: V4L: Özellik Maruz Kalma (15), cihaz tarafından desteklenmiyor". Eminim v4l2 kullanarak bunu yapmak mümkün olduğundan web kamerasının bu özelliği değiştirdiğinden eminim, o zaman problemin OpenCV'nin sarıcısı olduğunu düşünüyorum.

Ben de bir terminal komutu göndermek için altişlem lib kullanın ve V4L2 kullanarak özelliğini değiştirmek için çalıştı. Komut subprocess.call('v4l2-ctl --device=/dev/video0 --set-ctrl exposure_absolute=20', shell=True)'dur.

Sonuç olarak, poz_absolute değişiyor ancak mevcut video çekimime uygulanmadı. Resim 1, özelliği komut dosyasıyla ayarladıktan sonraki sonucu gösterir. Resim 2, aynı video yakalama etkinken aynı özelliği terminal aracılığıyla ayarladıktan sonraki sonucu gösterir.

Setting exposure_absolute via script (görüntü 1)

Setting exposure_absolute via terminal (resim 2) Görüntü 2 sağ görüntünün 1 sonra çekildi

, vurgulanan hat görüntünün aynıdır 1.

ben yanlış mı yapıyorum alt işlem çağrısında? Veya bu özelliğin bir betik kullanarak nasıl değiştirilmesini sağlayabilirim?

Ayrıca, neden cv2.VideoCapture(id) kamera özelliklerini sıfırlar, komut dosyasını çalıştırmadan önce bunları değiştirmek gerekmez, ve bunu durdurmak mümkün mü?

__________________________________________________

Düzenleme: belki bu sorun için bir çözüm buldular. Alt işlem çağrısı gerçekten doğru, özellikleri değiştirmeden önce sadece bir kez cv2.read() kullanmak zorunda kaldı, görünüşte ilk cv2.read() kamera özellikleri sıfırlandığı yerdir. Yine de web kamerasının özelliklerini otomatik olarak sıfırlamayı nasıl durduracağımı bilmiyorum.

+0

Kaynak modüllerine 'modules \ highgui \ src \ cap_libv4l.cpp' (özellikle 'icvSetControl' işlevi), CV2 kodları yerine bir V4L kontrol kodunun geçebilmeniz gerektiği görülecektir. Yani, V4L2_CID_EXPOSURE_ABSOLUTE'ün sayısal değerini bulun ([0x902] (http://lxr.free-electrons.com/source/include/uapi/linux/v4l2-controls.h#L88)?) set 'işlevi bununla -' set (0x902, 20) '. –

cevap

1

Eğer Gstreamer desteği ile OpenCV kurarsan

std::string cameraPipeline; 
cameraPipeline ="v4l2src device=/dev/video0 extra-controls=\"c,exposure_auto=1,exposure_absolute=500\" ! "; 
cameraPipeline+="video/x-raw, format=BGR, framerate=30/1, width=(int)1280,height=(int)720 ! "; 
cameraPipeline+="appsink"; 

VideoCapture cap; 
cap.open(cameraPipeline); 

Bu eserler bağlıdır: (bayrak: -D WITH_GSTREAMER = AÇIK) Eğer V4L2 için parametrelerin her türlü belirtebilirsiniz bir GStreamer boru hattı kullanarak bir VideoCapture açabilir C++ ve Python'da.Bir terminale yazarak kontrollerin tam listesini alabilirsiniz: v4l2-ctl --list-ctrls-menüler