การตั้งค่าพารามิเตอร์กล้องใน OpenCV / Python


87

ฉันใช้ OpenCV (2.4) และ Python (2.7.3) กับกล้อง USB จาก Thorlabs (DC1545M)

ฉันกำลังทำการวิเคราะห์รูปภาพในสตรีมวิดีโอและฉันต้องการที่จะเปลี่ยนพารามิเตอร์กล้องบางตัวจากสตรีมวิดีโอของฉัน สิ่งที่สับสนคือฉันสามารถเปลี่ยนคุณสมบัติบางอย่างของกล้องได้ แต่ไม่ใช่ทั้งหมดและฉันไม่แน่ใจว่าตัวเองทำอะไรผิด

นี่คือรหัสโดยใช้การผูก cv2 ใน Python และฉันสามารถยืนยันได้ว่ามันทำงาน:

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

สำหรับการอ้างอิงอาร์กิวเมนต์แรกในคำสั่งcap.set ()หมายถึงการแจงนับคุณสมบัติของกล้องตามรายการด้านล่าง:

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)

คำถามของฉันคือ:

เป็นไปได้ไหมที่จะตั้งเวลาเปิดรับกล้อง (หรือพารามิเตอร์ของกล้องอื่น ๆ ) ผ่าน python / opencv

ถ้าไม่ฉันจะตั้งค่าพารามิเตอร์เหล่านี้ได้อย่างไร

หมายเหตุ: ผู้ผลิตกล้องมีรหัส C ++ ที่แสดงวิธีการนี้ แต่ฉันไม่ใช่ผู้เชี่ยวชาญ (โดยการถ่ายภาพระยะไกล) ใน C ++ และขอขอบคุณโซลูชันที่ใช้ python

ขอบคุณล่วงหน้า!


3
ตัวเลือกที่ 15 คืออะไร CV_CAP_PROP_EXPOSURE? มันไม่ใช่เวลาเปิดรับแสงเหรอ?
Abid Rahman K

3
มันคือ. ประเด็นที่ฉันทำคือการพยายามแก้ไขสิ่งนั้นให้ผลลัพธ์ที่วัดผลได้ (นั่นคือสิ่งcap.set(15, x)ที่ไม่มีคุณค่าของxการเปลี่ยนแปลงที่วัดได้) ยังไงก็ตามขอขอบคุณสำหรับบล็อกของคุณ มันมีประโยชน์อย่างยิ่งสำหรับฉันในการเร่งความเร็วด้วย opencv ผ่าน python คุณจะได้รับการโหวตเพิ่มขึ้น :)
Mike

4
เขานับเลขผิด พวกเขาทั้งหมดสูงเกินไป ใครบางคนโปรดแก้ไข
Katastic Voyage

1
@KatasticVoyage เสร็จแล้วดูเหมือนจะใช่สำหรับฉันตอนนี้ :)
linusg

2
สำหรับ opencv 4 ฉันต้องลบคำนำหน้า "CV" ออกจากชื่อคุณสมบัติ ดังนั้นcv2.CV_CAP_PROP_FRAME_HEIGHT->cv2.CAP_PROP_FRAME_HEIGHT
Markus Weber

คำตอบ:


55

กล้องบางตัวไม่รองรับพารามิเตอร์ทั้งหมด - จริงๆแล้วมันเป็นส่วนที่ลำบากที่สุดในไลบรารี OpenCV กล้องแต่ละประเภทตั้งแต่กล้อง Android ไปจนถึงกล้อง USB ไปจนถึงกล้องมืออาชีพจะมีอินเทอร์เฟซที่แตกต่างกันเพื่อปรับเปลี่ยนพารามิเตอร์ มีหลายสาขาในรหัส OpenCV เพื่อรองรับหลายสาขา แต่แน่นอนว่าไม่ครอบคลุมความเป็นไปได้ทั้งหมด

สิ่งที่คุณทำได้คือตรวจสอบไดรเวอร์กล้องเขียนแพตช์สำหรับ OpenCV แล้วส่งไปที่ code.opencv.org วิธีนี้คนอื่นจะสนุกกับงานของคุณแบบเดียวกับที่คุณสนุกกับคนอื่น

นอกจากนี้ยังมีความเป็นไปได้ที่กล้องของคุณไม่รองรับคำขอของคุณกล้อง USB ส่วนใหญ่มีราคาถูกและเรียบง่าย บางทีพารามิเตอร์นั้นอาจไม่สามารถปรับเปลี่ยนได้

หากคุณแน่ใจว่ากล้องรองรับพารามิเตอร์ที่กำหนด (คุณบอกว่าผู้ผลิตกล้องให้รหัสบางอย่าง) และไม่ต้องการยุ่งกับ OpenCV คุณสามารถรวมโค้ดตัวอย่างนั้นใน C ++ ด้วย boost :: python เพื่อให้พร้อมใช้งานใน Python จากนั้นสนุกกับการใช้งาน


2
มีรายการกล้องที่รองรับสำหรับ opencv บน mac linux windows ไหม ดูเหมือนว่าในอนาคตฉันจะเริ่มต้นด้วยซอฟต์แวร์และกลับมาทำงานกับฮาร์ดแวร์ก่อนที่จะซื้อ การเขียนไดรเวอร์กล้องเป็นเป้าหมายที่ดี แต่จะต้องใช้เวลาสักพักก่อนที่ฉันจะเรียนรู้ที่จะทำเช่นนั้น
user391339

@sammy ฉันเคยโพสต์คำถามเกี่ยวกับวิธีการทำสิ่งนี้ ช่วยอธิบายให้ละเอียดที่นี่: stackoverflow.com/questions/27914780/…
evan54

27

ฉันมีปัญหาเดียวกันกับ openCV บน Raspberry Pi ... ไม่รู้ว่าวิธีนี้สามารถแก้ปัญหาของคุณได้หรือไม่ แต่สิ่งที่ได้ผลสำหรับฉันคือ

import time
import cv2


cap = cv2.VideoCapture(0)

cap.set(3,1280)

cap.set(4,1024)

time.sleep(2)

cap.set(15, -8.0)

เวลาที่คุณต้องใช้อาจแตกต่างกัน


ว้าวรหัสของคุณทำให้เว็บแคม Logitech c615 ของฉันทำงานบน macbook ด้วย opencv! “ มันใช้ได้!” ฉันพยายามมาหลายวันแล้ว ฉันไม่คิดว่ามันค่อนข้าง HD และไม่แน่ใจว่าฉันสามารถเปลี่ยนพารามิเตอร์โฟกัสได้หรือไม่ แต่เป็นการเริ่มต้นที่ดีจริงๆ
user391339

2
ฉันไม่ได้เป็นผู้เชี่ยวชาญและ 3, 4 และ 15 เป็นตัวเลขวิเศษสำหรับฉัน เป็นการแทนที่เช่น CV_CAP_PROP_FRAME_WIDTH หรือไม่
Allan Nørgaard

5
cap.set (15, -8.0) หมายถึงอะไร ฉันพยายามตั้งเวลาการเปิดรับแสงบนเว็บแคม Logitech ของฉัน
user391339

1
@ user391339 คุณตั้งเวลาเปิดรับแสงบนเว็บแคม Logitech แล้วหรือยัง
Abc

@ AllanNørgaardใช่ธงเป็นเพียงจำนวนเต็มในการปลอมตัว
Kev1n91

26

เพื่อหลีกเลี่ยงการใช้ค่าจำนวนเต็มเพื่อระบุVideoCaptureคุณสมบัติเราสามารถใช้เช่นcv2.cv.CV_CAP_PROP_FPSใน OpenCV 2.4 และcv2.CAP_PROP_FPSใน OpenCV 3.0 (ดูความคิดเห็นของ Stefan ด้านล่าง)

ฟังก์ชั่นยูทิลิตี้ที่ใช้ได้กับทั้ง OpenCV 2.4 และ 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 ถูกตั้งค่าไว้ก่อนหน้านี้ในรหัสยูทิลิตี้ของฉันดังนี้:

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

2
ฉันใช้เวลา 10 นาทีในการค้นหาว่าค่าคงที่ถูกกำหนดไว้ที่ใดใน Python - ขอบคุณ!
rescdsk

2
คุณพูดถูก - ถ้าคุณใช้เวอร์ชันเช่น 2.4.9 (2014-04-25 การดาวน์โหลดที่เสถียรจากopencv.org ) คุณต้องใช้cv2.cv.CV_CAP_PROP_XXXXสิ่งนี้ - สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้โปรดดู code.opencv.org/issues/3181 ถ้า คุณใช้สาขาล่าสุดที่คุณใช้ได้cv2.CAP_PROP_XXXX
Stefan Krüger

รายการคุณสมบัติทั่วไปของ Video Capture ล่าสุดอยู่ที่นี่ (OpenCV 4.3)
Mikolasan

8

ฉันไม่สามารถแก้ไขปัญหา OpenCV ได้เช่นกัน แต่วิธีแก้ปัญหา video4linux (V4L2) ใช้งานได้กับ OpenCV เมื่อใช้ Linux อย่างน้อยก็ทำบน Raspberry Pi กับ Rasbian และเว็บแคมราคาถูกของฉัน สิ่งนี้ไม่แข็งน้ำหนักเบาและพกพาได้อย่างที่คุณต้องการ แต่สำหรับบางสถานการณ์อาจมีประโยชน์มาก

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งแอปพลิเคชัน v4l2-ctl เช่นจากแพ็คเกจ Debian v4l-utils กว่ารัน (ก่อนรันแอปพลิเคชัน python หรือจากภายใน) คำสั่ง:

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

มันจะเขียนทับเวลาชัตเตอร์ของกล้องไปเป็นการตั้งค่าแบบแมนนวลและเปลี่ยนเวลาชัตเตอร์ (ในหน่วยมิลลิวินาที?) ด้วยพารามิเตอร์สุดท้ายเป็น (ในตัวอย่างนี้) 10. ยิ่งค่านี้ต่ำลงเท่าใดภาพก็จะยิ่งมืดลง


สิ่งนี้ใช้ได้กับแล็ปท็อปที่ใช้ Toshiba Intel ของฉันที่ใช้ Ubuntu 14.04 ฉันใช้ v4l2-ctl เพื่อตั้งค่าตัวเลือกที่ต้องการรวมถึงอัตราเฟรมด้วย ฉันลองใช้การตั้งค่าเหล่านี้กับ OpenCV แล้ว แต่มีข้อผิดพลาดเหมือนกับที่กล่าวมาข้างต้น
Derek Simkowiak

4

หากใครยังสงสัยว่าค่าในCV_CAP_PROP_EXPOSUREอาจเป็นอย่างไร:

ขึ้นอยู่กับ. สำหรับเว็บแคมราคาถูกของฉันฉันต้องป้อนค่าที่ต้องการโดยตรงเช่น 0.1 สำหรับ 1/10 วินาที สำหรับกล้องอุตสาหกรรมราคาแพงของฉันฉันต้องป้อน -5 เพื่อให้ได้เวลาเปิดรับแสง 2 ^ -5 วินาที = 1/32 วินาที


ฟังก์ชัน set ของ OpenCV สามารถจัดการกับจำนวนเต็มได้หรือไม่?
Saeed Masoomi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.