OpenCV / Python에서 카메라 매개 변수 설정


88

저는 Thorlabs (DC1545M)의 USB 카메라와 함께 OpenCV (2.4)와 Python (2.7.3)을 사용하고 있습니다.

비디오 스트림에서 일부 이미지 분석을 수행 중이며 비디오 스트림에서 일부 카메라 매개 변수를 변경할 수 있기를 원합니다. 혼란스러운 점은 카메라 속성 중 일부를 변경할 수 있지만 전부는 아니고 내가 뭘 잘못하고 있는지 잘 모르겠다는 것입니다.

다음은 Python에서 cv2 바인딩을 사용하는 코드이며 실행되는지 확인할 수 있습니다.

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 ++ 전문가가 아니므로 모든 파이썬 기반 솔루션을 고맙게 생각합니다.

미리 감사드립니다!


3
그렇다면 15 번째 옵션, 즉 CV_CAP_PROP_EXPOSURE는 무엇입니까? 노출 시간 아닌가요?
Abid Rahman K

3
그것은. 내가 말한 요점은 측정 가능한 결과를 생성하는 수정을 시도한다는 것입니다. (즉,의 cap.set(15, x)값이 x측정 가능한 변화 를 생성 하지 않는 경우입니다 .) 그런데 블로그에 감사드립니다. 파이썬을 통해 opencv를 빠르게 익히는 데 매우 유용했습니다. 당신은 그 :)에 대한 upvote에 얻을
마이크

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를 엉망으로 만들고 싶지 않은 경우, 해당 샘플 코드를 boost :: python으로 C ++로 래핑하여 Python에서 사용할 수 있습니다. 그런 다음 사용을 즐기십시오.


2
Mac Linux Windows에서 opencv에 지원되는 카메라의 작업 목록이 있습니까? 미래에 소프트웨어로 시작한 다음 구매하기 전에 하드웨어로 다시 작업 할 것 같습니다. 카메라 드라이버를 작성하는 것은 좋은 목표이지만 그렇게하는 법을 배우기까지는 시간이 좀 걸릴 것입니다.
user391339

@sammy이 작업을 수행하는 방법에 대한 질문을 게시했습니다. 여기에 자세히
설명해

27

나는 Raspberry Pi의 openCV와 동일한 문제가있었습니다 ...이 문제를 해결할 수 있는지 모르겠지만 나를 위해 일한 것은

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 웹캠이 opencv로 내 macbook에서 작동합니다! "그냥 작동합니다!" 나는 이것을 며칠 동안 시도 해왔다. 나는 그것이 꽤 HD라고 생각하지 않고 초점 매개 변수를 변경할 수 있는지 확실하지 않지만 정말 좋은 시작입니다.
user391339

2
나는 결코 전문가가 아니며 3, 4, 15는 나에게 마법의 숫자입니다. 예를 들어 CV_CAP_PROP_FRAME_WIDTH를 대체합니까?
Allan Nørgaard 2014

5
cap.set (15, -8.0)은 무엇을 의미합니까? 로지텍 웹캠에서 노출 시간을 설정하려고합니다.
user391339

1
@ user391339 Logitech 웹캠에서 노출 시간을 설정 했습니까?
Abc

@ AllanNørgaard 예, 플래그는 변장의 정수일뿐입니다
Kev1n91

26

VideoCapture속성 을 식별하기 위해 정수 값을 사용하지 않으려면 예를 들어 cv2.cv.CV_CAP_PROP_FPSOpenCV 2.4 및 cv2.CAP_PROP_FPSOpenCV 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 분을 보냈습니다. 감사합니다!
rescdsk 2013

2
당신은 맞다 - 당신은 2.4.9 (에서 2014년 4월 25일 안정적인 다운로드와 같은 버전을 사용하는 경우 opencv.org을 ) 당신이 사용해야 할 cv2.cv.CV_CAP_PROP_XXXX것 -이 참조에 대한 자세한 정보를 정기적를 들어 code.opencv.org/issues/3181 경우 당신은 당신이 사용할 수있는 최신 분기를 사용cv2.CAP_PROP_XXXX
스테판 크루거

비디오 캡처 일반 속성의 최신 목록은 여기에 있습니다 (OpenCV 4.3)
Mikolasan

8

나도 문제 OpenCV의 문제를 해결 할 수 없습니다,하지만하는 video4linux (V4L2) 해결 방법은 작업을 수행 하여 리눅스를 사용하는 경우 OpenCV의. 적어도 Rasbian과 저렴한 웹캠으로 Raspberry Pi에서 작동합니다. 이것은 당신이 원하는만큼 단단하고 가볍고 휴대 성이 좋지는 않지만 어떤 상황에서는 매우 유용 할 수 있습니다.

예를 들어 Debian v4l-utils 패키지에서 v4l2-ctl 애플리케이션이 설치되어 있는지 확인합니다. 다음 명령을 실행합니다 (python 애플리케이션을 실행하기 전 또는 내부에서) :

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

카메라 셔터 시간을 수동 설정으로 덮어 쓰고 마지막 매개 변수가있는 셔터 시간 (ms?)을 10으로 변경합니다.이 값이 낮을수록 이미지가 어두워집니다.


이것은 Ubuntu 14.04를 실행하는 Toshiba Intel 기반 랩톱에서 작동했습니다. v4l2-ctl을 사용하여 프레임 속도를 포함하여 원하는 옵션을 설정했습니다. OpenCV로 이러한 설정을 시도했지만 위와 동일한 오류가 발생했습니다.
Derek Simkowiak

4

누군가의 가치가 무엇인지 여전히 궁금해하는 경우 CV_CAP_PROP_EXPOSURE:

의존합니다. 저렴한 웹캠의 경우 원하는 값을 직접 입력해야합니다 (예 : 1/10 초의 경우 0.1). 비싼 산업용 카메라의 경우 2 ^ -5s = 1 / 32s의 노출 시간을 얻으려면 -5를 입력해야합니다.


OpenCV의 설정 기능은 정수를 처리 할 수 ​​있습니까?
사이드 Masoomi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.