Mengatur Parameter Kamera di OpenCV / Python

87

Saya menggunakan OpenCV (2.4) dan Python (2.7.3) dengan kamera USB dari Thorlabs (DC1545M).

Saya melakukan beberapa analisis gambar pada aliran video dan saya ingin dapat mengubah beberapa parameter kamera dari aliran video saya. Hal yang membingungkan adalah saya dapat mengubah beberapa properti kamera tetapi tidak semuanya, dan saya tidak yakin apa yang saya lakukan salah.

Ini kodenya, menggunakan binding cv2 dengan Python, dan saya dapat mengonfirmasi bahwa itu berjalan:

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()

Sebagai referensi, argumen pertama dalam perintah cap.set () merujuk pada enumerasi properti kamera, yang tercantum di bawah ini:

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)

Pertanyaan saya adalah:

Apakah mungkin untuk mengatur waktu eksposur kamera (atau parameter kamera lainnya) melalui python / opencv?

Jika tidak, bagaimana cara saya mengatur parameter ini?

Catatan: Ada kode C ++ yang disediakan oleh pabrikan kamera yang menunjukkan cara melakukan ini, tetapi saya bukan ahli (sejauh ini) dalam C ++ dan akan menghargai solusi berbasis python.

Terima kasih sebelumnya!

Mike
sumber
3
Lalu apa pilihan ke-15, yaitu CV_CAP_PROP_EXPOSURE? Bukankah itu waktu eksposur?
Abid Rahman K
3
Ini. Poin yang saya buat adalah bahwa mencoba memodifikasi itu memang menghasilkan hasil yang terukur. (Itulah cap.set(15, x), di mana tidak ada nilai xmenghasilkan perubahan yang terukur.) Ngomong-ngomong, terima kasih untuk blog Anda. Ini sangat berguna bagi saya untuk meningkatkan kecepatan dengan opencv melalui python. Anda mendapatkan upvote untuk itu :)
Mike
4
Dia salah menghitung mereka. Mereka semua TERLALU TINGGI. Seseorang tolong edit itu.
Katastic Voyage
1
@KatasticVoya selesai, tampaknya benar untuk saya sekarang :)
linusg
2
Untuk opencv 4 saya harus menghapus awalan "CV" dari nama properti. Jadi cv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

Jawaban:

55

Tidak semua parameter didukung oleh semua kamera - sebenarnya, itu adalah salah satu bagian yang paling merepotkan dari pustaka OpenCV. Setiap jenis kamera - dari kamera android hingga kamera USB hingga kamera profesional menawarkan antarmuka berbeda untuk mengubah parameternya. Ada banyak cabang dalam kode OpenCV untuk mendukung sebanyak mungkin dari mereka, tetapi tentu saja tidak semua kemungkinan tercakup.

Apa yang dapat Anda lakukan adalah menyelidiki driver kamera Anda, menulis patch untuk OpenCV dan mengirimkannya ke code.opencv.org. Dengan cara ini orang lain akan menikmati pekerjaan Anda, sama seperti Anda menikmati pekerjaan orang lain.

Ada juga kemungkinan kamera Anda tidak mendukung permintaan Anda - kebanyakan kamera USB murah dan sederhana. Mungkin parameter itu tidak tersedia untuk modifikasi.

Jika Anda yakin kamera mendukung parameter tertentu (Anda mengatakan produsen kamera menyediakan beberapa kode) dan tidak ingin mengacaukan OpenCV, Anda dapat membungkus kode sampel itu dalam C ++ dengan boost :: python, agar tersedia dengan Python. Kemudian, nikmatilah menggunakannya.

Sam
sumber
2
apakah ada daftar kerja kamera yang didukung untuk opencv di mac linux windows? Kedengarannya seperti di masa depan saya akan mulai dengan perangkat lunak dan kemudian bekerja kembali ke perangkat keras sebelum membeli. menulis driver kamera adalah tujuan yang bagus tetapi butuh waktu lama sebelum saya bisa belajar melakukannya.
pengguna391339
@sammy Saya telah memposting pertanyaan tentang bagaimana melakukan ini. Maukah Anda menjelaskannya di sini: stackoverflow.com/questions/27914780/…
evan54
27

Saya memiliki masalah yang sama dengan openCV di Raspberry Pi ... tidak tahu apakah ini dapat menyelesaikan masalah Anda, tetapi yang berhasil untuk saya adalah

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

waktu yang harus Anda gunakan bisa berbeda

Lorenzo
sumber
wow, kode Anda membuat webcam logitech c615 saya berfungsi di macbook saya dengan opencv! "itu berhasil!" Saya telah mencoba ini selama berhari-hari. Saya rasa ini tidak cukup HD dan tidak yakin apakah saya dapat mengubah parameter fokus, tetapi awal yang sangat baik.
pengguna391339
2
Saya sama sekali bukan ahli, dan 3, 4, dan 15 adalah angka ajaib bagi saya. Apakah ini pengganti misalnya CV_CAP_PROP_FRAME_WIDTH?
Allan Nørgaard
5
apa arti cap.set (15, -8.0)? Saya mencoba mengatur waktu eksposur pada webcam logitech saya.
pengguna391339
1
@ user391339 sudahkah Anda menyetel waktu pemaparan pada webcam Logitech?
Abc
@ AllanNørgaard ya, benderanya hanya bilangan bulat yang menyamar
Kev1n91
26

Untuk menghindari penggunaan nilai integer untuk mengidentifikasi VideoCaptureproperti, seseorang dapat menggunakan, misalnya, cv2.cv.CV_CAP_PROP_FPSdi OpenCV 2.4 dan cv2.CAP_PROP_FPSdi OpenCV 3.0. (Lihat juga komentar Stefan di bawah.)

Berikut fungsi utilitas yang berfungsi untuk OpenCV 2.4 dan 3.0:

# 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 diatur sebelumnya dalam kode utilitas saya seperti ini:

from pkg_resources import parse_version
OPCV3 = parse_version(cv2.__version__) >= parse_version('3')
Ulrich Stern
sumber
2
Saya menghabiskan 10 menit mencoba menemukan di mana konstanta tersebut didefinisikan dengan Python - terima kasih!
rescdsk
2
Anda benar - jika Anda menggunakan versi seperti 2.4.9 (2014-04-25 unduhan stabil dari opencv.org ) Anda harus menggunakannya cv2.cv.CV_CAP_PROP_XXXX- untuk info lebih lanjut tentang ini lihat code.opencv.org/issues/3181 if Anda menggunakan cabang terbaru yang dapat Anda gunakancv2.CAP_PROP_XXXX
Stefan Krüger
Daftar terbaru dari properti umum Video Capture ada di sini (OpenCV 4.3)
Mikolasan
8

Saya juga tidak dapat memperbaiki masalah OpenCV, tetapi solusi video4linux (V4L2) berfungsi dengan OpenCV saat menggunakan Linux. Setidaknya, itu terjadi di Raspberry Pi saya dengan Rasbian dan webcam murah saya. Ini tidak sekokoh, ringan dan portabel seperti yang Anda inginkan, tetapi untuk beberapa situasi ini mungkin sangat berguna.

Pastikan Anda telah menginstal aplikasi v4l2-ctl, misalnya dari paket Debian v4l-utils. Kemudian jalankan (sebelum menjalankan aplikasi python, atau dari dalam) perintah:

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

Ini menimpa waktu rana kamera Anda ke pengaturan manual dan mengubah waktu rana (dalam ms?) Dengan parameter terakhir menjadi (dalam contoh ini) 10. Semakin rendah nilai ini, semakin gelap gambarnya.

JoepBC
sumber
Ini berfungsi pada laptop berbasis Intel Toshiba saya yang menjalankan Ubuntu 14.04. Saya menggunakan v4l2-ctl untuk mengatur opsi apa pun yang saya inginkan, termasuk frekuensi gambar. Saya memang mencoba pengaturan ini dengan OpenCV tetapi mendapat kesalahan yang sama seperti di atas.
Derek Simkowiak
4

Jika ada yang masih bertanya-tanya apa nilainya CV_CAP_PROP_EXPOSURE:

Tergantung. Untuk webcam murah saya, saya harus memasukkan nilai yang diinginkan secara langsung, misalnya 0,1 untuk 1 / 10s. Untuk kamera industri mahal saya, saya harus memasukkan -5 untuk mendapatkan waktu pencahayaan 2 ^ -5s = 1 / 32s.

Zac Diggum
sumber
fungsi set OpenCV dapat menangani bilangan bulat?
Saeed Masoomi