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!
sumber
cap.set(15, x)
, di mana tidak ada nilaix
menghasilkan 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 :)cv2.CV_CAP_PROP_FRAME_HEIGHT
->cv2.CAP_PROP_FRAME_HEIGHT
Jawaban:
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.
sumber
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
sumber
Untuk menghindari penggunaan nilai integer untuk mengidentifikasi
VideoCapture
properti, seseorang dapat menggunakan, misalnya,cv2.cv.CV_CAP_PROP_FPS
di OpenCV 2.4 dancv2.CAP_PROP_FPS
di 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')
sumber
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
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.
sumber
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.
sumber