2019. 8. 13. 11:07ㆍProgramming/OpenCV
안녕하세요! Nitro입니다.
오늘은 저의 개인 프로젝트로 진행하던 Stereo Vision Camera를 이용한 Depth Map 생성 프로젝트 도중 발생한 어이없지만 찾기는 생각보다 힘들었던 문제의 해결법을 공유하고자 합니다.
[시작하기 전]
혹시 여러개의 카메라가 한 개의 USB 허브에 연결되어있다면, 본체 뒤에 한번 연결해보시고 시도해보세요!
프로젝트 진행을 위하여 아마존에서 구매했던 SVPRO 720p HD Webcam입니다.
한 개의 USB 포트로 2개의 카메라를 사용할 수 있으며, 상당히 작음에도 불구하고 720p의 화질을 지원하는 카메라입니다.
https://www.amazon.com/SVPRO-Biometric-printer-Android-Windows/dp/B07C2NTMRC
여담으로 가로가 7.5cm 정도밖에 안됩니다.
아무튼 이 친구를 이용하여 Stereo Vision을 구현할 것인데요,
평범하게 VideoCapture 함수를 이용해 위와 같은 코드를 짰습니다.
(글 쓰면서 보니 오류 있네요, 16번째 줄에 imgLc를 CamL로, 17번째 줄에 imgRc를 CamR로 바꾸어 주시길 바랍니다.)
그리고 실행시키면...
프레임을 잡을 수 없다면서 오류를 뿜습니다.
위 오류는 아마도 한 개의 USB 포트, 혹은 USB 허브를 사용하게 되면서 발생하는 오류로써, 처리해야 하는 데이터량이 많아지면서 발생하는 오류인듯합니다.
해결법은 생각보다 간단합니다.
OpenCV에서 지원해주는 Backend API를 통해 처리속도를 늘려주시고, 프레임 크기를 줄여서 고정시켜주시면 됩니다.
프레임은 400, 300으로 고정시켜뒀지만 실제 크기는 아닌 것 같더군요. 프레임 고정값 또한 쪼금식 키우거나 줄이면서 한계점을 찾으시면 됩니다.
(글 쓰면서 보니 오류 있네요, 21번째 줄에 imgLc를 CamL로, 22번째 줄에 imgRc를 CamR로 바꾸어 주시길 바랍니다.)
OpenCV에서 지원하는 Video I/O Backend API는 위와 같으며, 더욱 자세한 내용은 아래의 링크에서 확인 가능합니다.
https://docs.opencv.org/3.4/d0/da7/videoio_overview.html
Backend API는 기기별/OS별 성능차가 발생할 수 있으니, 시간 나면 테스트해보시길 바랍니다.
아무튼 이 글에서는 DSHOW (Direct Show)를 사용합니다.
그리고 실행시켜보면..!
이렇게 문제없이 카메라를 불러올 수 있습니다.
사실 USB Bandwidth만의 문제는 아닌 것 같습니다.
AMCAP이라는 웹캠 캡처 테스트 프로그램을 사용하면 1280*720p의 해상도가 약 20fps 정도를 유지하며 잘만 나옵니다.
https://drive.google.com/file/d/1uij0WVkqdsWakgl48XBpIyDNyE14lyNK/view?usp=sharing
이 친구가 어느 API를 쓰는지, 어떤 식으로 웹캠을 불러오는지는 모르겠으나, 한번 찾아봐야 할 듯합니다.
도움이 되었으면 좋겠네요 :)
궁금하신 점이나 오류가 있으시다면 댓글로 남겨주세요!