Horizontal Grays S2 :: Horizontal Grays S2

Basler 카메라는 흑백은 둘째치고 비네팅이 생긴다... FOV도 현재 사용하고자 하는 영역과 맞지 않는다.

Application에 맞는 카메라와 렌즈는 딜리버리가 6개월... 이놈의 공급망 문제 ㅠㅜ

 

일단 알고리즘은 계속 진행해야 해서 로지텍 웹캠으로 알고리즘은 진행하기로 하고 적당한 카메라는 계속 고민 중이다.

 

여튼 로지텍 웹캠을 opencv에서 장치를 열때 발생하는 문제에 대해 적어본다.

( 단지 C930C 만의 문제일지 해당하는 모델이 더 있는지는 모르겠다.)

 

기본적으로 opencv에서 장치를 열때

 

cap = cv2.VideoCapture(0)

 

이와 같이 VedeoCapture 함수로 장치를 열고 괄호 안의 장치번호를 이용하는데 현재 노트북을 사용하고 있어서

노트북 기본 카메라가 0번

로지텍 웹캠이 1번이었다.

 

그런데 문제는 cap = cv2.VideoCapture(1) 로 열면 640 * 480 화질로 열리긴 하는데 원래의 해상도인 FULL HD로 설정이 안된다.

 

cap = cv2.VideoCapture(1)

cap.set(cv2.CAP_PROP_FRAME_WIDTH,1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,1080)

여기서 VedeoCapture를 열때 방법이 있다.

아래의 opencv document에 자세히 나와있다.

OpenCV: Flags for video I/O

 

OpenCV: Flags for video I/O

enum  cv::VideoCaptureAPIs {   cv::CAP_ANY = 0,   cv::CAP_VFW = 200,   cv::CAP_V4L = 200,   cv::CAP_V4L2 = CAP_V4L,   cv::CAP_FIREWIRE = 300,   cv::CAP_FIREWARE = CAP_FIREWIRE,   cv::CAP_IEEE1394 = CAP_FIREWIRE,   cv::CAP_DC1394 = CAP_FIRE

docs.opencv.org

 

그래서 아래처럼 해보았더니 바로 열리긴 한다.

cap = cv2.VideoCapture(1,cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,1080)

해상도도 FULL HD로 설정이 되었다. 문제는 보여지는 화면이 뭔가 끊기는 기분이라 Frame을 계산해서 출력해보았더니...

5FPS... 30FPS이 5FPS로 Frame Drop이 일어났다.

 

뭐 Buffer 셋팅에서부터 별걸 다해보았지만 아무것도 안됨

 

결국 로지텍 웹캠이 지원하는 open 방법이 무엇인지를 찾아보니

cap = cv2.VideoCapture(1,cv2.CAP_DSHOW)

cap = cv2.VideoCapture(1,cv2.CAP_MSMF)

이 두가지 방법이었다.

Direct Show는 Frame Drop 이 있으니 안되고 MSMF로 시도해보았더니 아.. 이 MSMF가 별도의 설정없이 VideoCapture(1) 이것이었다. 이게 아예 안되는 것은 아니었고

열리고 FULL HD로 셋팅은 되는데 시간이 5분가량 걸린다...

이래선 진행을 할 수 가없다. ㅠㅜ

 

열심히 검색한 결과 해결방법을 찾았는데 python 코드 앞머리에서 아래와 같은 설정을 해주어야 한다.

os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"
 
 

이것도 주의해야 하는데

 

import os
import cv2
import timeit
import numpy as np
os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"
 
이렇게 import의 뒤에 갖다 놓으면 동작 안됨 --;;;
 

 

import os
os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0"
import cv2
import timeit
import numpy as np
 
이렇게 해야 정상적으로 동작
 
여튼 이 방법으로 로지텍 C930C는 정상적으로 바로 열리고 Frame Drop 없이 FULL-HD 해상도로 설정도 가능하게 되었다.
 
관련 자료가 없어 애먹어서 여기에 남긴다.

+ Recent posts