OpenCV / Python'da Kamera Parametrelerini Ayarlama


87

OpenCV (2.4) ve Python (2.7.3) Thorlabs'tan (DC1545M) bir USB kamera ile kullanıyorum.

Bir video akışı üzerinde bazı görüntü analizi yapıyorum ve video akışımdan bazı kamera parametrelerini değiştirebilmek istiyorum. Kafa karıştırıcı olan şey, bazı kamera özelliklerini değiştirebiliyorum ama hepsini değil ve neyi yanlış yaptığımdan emin değilim.

İşte Python'da cv2 bağlamalarını kullanan kod ve çalıştığını onaylayabilirim:

import cv2


#capture from camera at location 0
cap = cv2.VideoCapture(0)
#set the width and height, and UNSUCCESSFULLY set the exposure time
cap.set(3,1280)
cap.set(4,1024)
cap.set(15, 0.1)

while True:
    ret, img = cap.read()
    cv2.imshow("input", img)
    #cv2.imshow("thresholded", imgray*thresh2)

    key = cv2.waitKey(10)
    if key == 27:
        break


cv2.destroyAllWindows() 
cv2.VideoCapture(0).release()

Referans için, cap.set () komutundaki ilk argüman , aşağıda listelenen kamera özelliklerinin numaralandırılmasını ifade eder:

0. CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
1. CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
2. CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file
3. CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
4. CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
5. CV_CAP_PROP_FPS Frame rate.
6. CV_CAP_PROP_FOURCC 4-character code of codec.
7. CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
8. CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
9. CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
10. CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
11. CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
12. CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
13. CV_CAP_PROP_HUE Hue of the image (only for cameras).
14. CV_CAP_PROP_GAIN Gain of the image (only for cameras).
15. CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
16. CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
17. CV_CAP_PROP_WHITE_BALANCE Currently unsupported
18. CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)

Sorularım:

Python / opencv ile kamera pozlama süresini (veya diğer kamera parametrelerini) ayarlamak mümkün mü?

Değilse, bu parametreleri nasıl ayarlayabilirim?

Not: Kamera üreticisi tarafından bunun nasıl yapılacağını gösteren C ++ kodu var, ancak C ++ konusunda uzman değilim (uzun bir atışla) ve herhangi bir python tabanlı çözümü takdir ediyorum.

Şimdiden teşekkürler!


3
Peki 15. seçenek nedir, yani CV_CAP_PROP_EXPOSURE? Maruz kalma süresi değil mi?
Abid Rahman K

3
Bu. Söylediğim nokta, bunu değiştirmeye çalışmanın ölçülebilir bir sonuç üretmemesidir. (bu cap.set(15, x), hiçbir değerin xölçülebilir bir değişim üretmediği yerdir .) Bu arada, blogunuz için teşekkür ederim. Python aracılığıyla opencv ile hızlanmak benim için çok faydalı oldu. Bunun için bir olumlu oy alırsınız :)
Mike

4
Onları yanlış numaralandırdı. Hepsi BİR ÇOK YÜKSEK. Lütfen birisi düzenleyin.
Katastic Voyage

1
@KatasticVoyage bitti, şimdi bana doğru görünüyor :)
linusg

2
Opencv 4 için özellik adlarından "CV" önekini kaldırmam gerekiyor. So cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Yanıtlar:


55

Tüm parametreler tüm kameralar tarafından desteklenmez - aslında bunlar OpenCV kütüphanesinin en zahmetli kısımlarından biridir. Android kameralardan USB kameralara ve profesyonel kameralara kadar her kamera türü, parametrelerini değiştirmek için farklı bir arayüz sunar. OpenCV kodunda, birçoğunu desteklemek için birçok şube vardır, ancak elbette tüm olasılıklar kapsanmamaktadır.

Yapabileceğiniz şey, kamera sürücünüzü araştırmak, OpenCV için bir yama yazmak ve bunu code.opencv.org adresine göndermektir. Bu şekilde başkalarının işinden zevk aldığınız gibi başkaları da sizin işinizden keyif alacak.

Kameranızın isteğinizi desteklememe ihtimali de vardır - çoğu USB kamera ucuz ve basittir. Belki de bu parametre değişiklikler için mevcut değildir.

Kameranın belirli bir parametreyi desteklediğinden eminseniz (kamera üreticisinin bazı kodlar sağladığını söylüyorsunuz) ve OpenCV ile uğraşmak istemiyorsanız, Python'da kullanılabilir hale getirmek için bu örnek kodu C ++ 'da boost :: python ile sarmalayabilirsiniz. Ardından, kullanmanın tadını çıkarın.


2
mac linux pencerelerinde opencv için desteklenen kameraların çalışma listesi var mı? Gelecekte yazılımla başlayacağım ve ardından satın almadan önce donanıma geri döneceğim. kamera sürücüsü yazmak iyi bir hedef ama bunu yapmayı öğrenmem biraz zaman alacak.
user391339

@sammy Bunun nasıl yapılacağına dair bir soru yayınladım. Burada detaylandırmak ister misiniz: stackoverflow.com/questions/27914780/…
evan54

27

Raspberry Pi'de openCV ile aynı sorunu yaşadım ... bunun sorununuzu çözüp çözemeyeceğini bilmiyorum, ama benim için işe yarayan şey

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

kullanmak zorunda olduğun zaman farklı olabilir


vay canına, kodunuz logitech c615 web kameramı opencv ile macbook'umda çalıştırdı! "sadece çalışıyor!" Bunu günlerdir deniyordum. Oldukça HD olduğunu düşünmüyorum ve odak parametrelerini değiştirip değiştiremeyeceğime emin değilim, ama gerçekten iyi bir başlangıç.
user391339

2
Ben kesinlikle bir uzman değilim ve 3, 4 ve 15 benim için sihirli sayılardır. Örneğin CV_CAP_PROP_FRAME_WIDTH'nin yerini mi alıyor?
Allan Nørgaard

5
cap.set (15, -8.0) ne anlama geliyor? Logitech web kameramda pozlama süresini ayarlamaya çalışıyorum.
user391339

1
@ user391339 Logitech web kamerasında pozlama süresini ayarladınız mı?
Abc

@ AllanNørgaard evet, bayraklar kılık değiştirmiş tam sayılardır
Kev1n91

26

VideoCaptureÖzellikleri tanımlamak için tamsayı değerlerini kullanmaktan kaçınmak için, örneğin cv2.cv.CV_CAP_PROP_FPSOpenCV 2.4 ve cv2.CAP_PROP_FPSOpenCV 3.0'da kullanılabilir. (Ayrıca Stefan'ın aşağıdaki yorumuna bakın.)

Burada hem OpenCV 2.4 hem de 3.0 için çalışan bir yardımcı program işlevi:

# returns OpenCV VideoCapture property id given, e.g., "FPS"
def capPropId(prop):
  return getattr(cv2 if OPCV3 else cv2.cv,
    ("" if OPCV3 else "CV_") + "CAP_PROP_" + prop)

OPCV3 benim yardımcı program kodumda daha önce şu şekilde ayarlanmış:

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')

2
Bu sabitlerin Python'da nerede tanımlandığını bulmak için 10 dakika harcadım - teşekkür ederim!
rescdsk

2
haklısın - Eğer 2.4.9 (dan 2014/04/25 istikrarlı indirmek gibi bir sürümünü kullanıyorsanız opencv.org ) kullanmak zorunda cv2.cv.CV_CAP_PROP_XXXXşey - bu bkz hakkında daha fazla diğer bilgiler için code.opencv.org/issues/3181 eğer kullanabileceğiniz en son şubeyi kullanıyorsunuzcv2.CAP_PROP_XXXX
Stefan Krüger

Video Capture jenerik özelliklerinin en son listesi burada (OpenCV 4.3)
Mikolasan

8

OpenCV sorununu da çözemedim, ancak Linux kullanırken bir video4linux (V4L2) geçici çözümü OpenCV ile çalışıyor . En azından, Rasbian ile Raspberry Pi'mde ve ucuz web kameramda oluyor. Bu, olmasını istediğiniz kadar sağlam, hafif ve taşınabilir değildir, ancak bazı durumlarda yine de çok yararlı olabilir.

Debian v4l-utils paketinden v4l2-ctl uygulamasının kurulu olduğundan emin olun. Ardından komutu çalıştırın (python uygulamasını çalıştırmadan önce veya içinden):

v4l2-ctl -d /dev/video1 -c exposure_auto=1 -c exposure_auto_priority=0 -c exposure_absolute=10

Kamera deklanşör sürenizin üzerine manuel ayarlara yazar ve en son parametre ile deklanşör süresini (ms? Cinsinden) 10 olarak değiştirir (bu örnekte). Bu değer ne kadar düşükse, görüntü o kadar koyu olur.


Bu, Ubuntu 14.04 çalıştıran Toshiba Intel tabanlı dizüstü bilgisayarımda çalıştı. Kare hızı dahil istediğim herhangi bir seçeneği ayarlamak için v4l2-ctl kullandım. Bu ayarları OpenCV ile denedim ancak yukarıdakilerle aynı hataları aldım.
Derek Simkowiak

4

Hala değerin ne CV_CAP_PROP_EXPOSUREolabileceğini merak eden biri varsa :

Bağlı olmak. Ucuz web kameram için istenen değeri doğrudan girmem gerekiyor, örneğin 1/10 saniye için 0.1. Pahalı endüstriyel kameram için 2 ^ -5s = 1 / 32s pozlama süresi elde etmek için -5 girmem gerekiyor.


OpenCV'nin set işlevi tam sayıları işleyebilir mi?
Saeed Masoomi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.