티스토리 뷰

728x90
반응형

opencv같은 라이브러리를 사용하여 카메라 입력 신호를 받아 처리하고 싶을때 그동안 로컬에서 opencv를 설치하여 사용했다. 도커로 opencv가 탑재되어 있는 컨테이너를 실행시킬때 highgui 같은 윈도우 디스플레이, 윈도우 이벤트 관련 라이브러리를 이용하여  결과를 보고 싶을 때 또한 카메라를 컨테이너에 연결시켜 결국 프로세싱을 시켜야 하는 문제가 있다.

 

 

실험용 opencv 도커 받기 

일단 편의상 실험용으로 python3 버전과 opencv가 설치된 도커를 사용하기로 했다. 파이썬에 필요한 opencv 버전을 깔아도 무방한데 정말 편의상 두가지가 갖추어진 임의의 도커를 선택하였다. 

 

https://github.com/janza/docker-python3-opencv

 

janza/docker-python3-opencv

🐋 🐍 👁 Docker image with python 3 and opencv 3.4. Contribute to janza/docker-python3-opencv development by creating an account on GitHub.

github.com

다음 명령어로 도커이미지를 다운받는다. 

$ docker run -it jjanzic/docker-python3-opencv python

파이썬 명령어 모드로 실행되는데 다음 코드를 실행해보면 opencv를 실행해볼 수 있음을 확인할 수 있다.

>> import cv2
>> cv2.__version__

exit() 코드를 넣어 파이썬에서 나오거나 도커에서 빠져나오면 된다. 

 

 

카메라/X윈도우 연결하여 도커 실행하기 

카메라 입력을 도커 컨테이너에 연결하고 그 결과를 윈도우 창에 띄어 보고 싶을 경우 도커에 해당 하드웨어를 연결시켜 주어야 한다. 

 

다음 자료에서 많은 힌트를 얻었다.

https://github.com/chipgarner/opencv3-webcam-docker

 

chipgarner/opencv3-webcam-docker

Dockerfile and instructions for OpenCV 3.1 with Python 2.7 with Cuda GPU support and access to a display and webcam. - chipgarner/opencv3-webcam-docker

github.com

 

$ docker run --privileged --rm -it --env DISPLAY=$DISPLAY --env="QT_X11_NO_MITSHM=1" -v /dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix:ro -v $(pwd):/workspace jjanzic/docker-python3-opencv:latest

아래 다섯가지 옵션 중 마지막을 제외한 네개의 옵션이 윈도우와 카메라를 연결하여 사용하는 옵션이다.

 

--env DISPLAY=$DISPLAY  → 호스트의 디스플레이 아이디 전달

--env="QT_X11_NO_MITSHM=1" → OpenCV에서 디스플레이 사용시 필요(정확한 의미 모름)

-v /dev/video0:/dev/video0 → 호스트의 카메라를 컨터이너에 전달

-v /tmp/.X11-unix:/tmp/.X11-unix:ro → 호스트의 X윈도우와 컨테이너의 X윈도우 연결

-v $(pwd):/workspace →  호스트의 폴더를 컨터이너에 연결 

 

프로그램들 설치 

간단히 코딩하기 위해 다음과 같이 실해된 컨테이너 안에서 다음 코드를 입력한다.

기본 업데이트 

$ apt-get update

 

vi 에디터 설치 

$ apt-get vim

 

pip 업그레이드

$ pip install --upgrade pip

 

주피터 노트북 설치하기 

$ pip install jupyter 

샘플 프로그램 작성 

카메라 입력을 받아 윈도우에 디스플레이하는 기본 코드를 다음과 같이 작성한다.

# camcapture_test.py
import cv2

capture = cv2.VideoCapture(0)
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    ret, frame = capture.read()
    cv2.imshow("VideoFrame", frame)
    if cv2.waitKey(1) > 0: break

capture.release()
cv2.destroyAllWindows()

 

다음과 같이 작성한 파이썬 코드를 수행시켜본다. 

$ python camcapture_test.py

 

문제가 없을 경우 윈도우상에 카메라 입력 영상이 보이게 된다. 그런데 다음과 같은 에러가 나타났다.

 

cv2.error: OpenCV(4.0.1) /opencv-4.0.1/modules/highgui/src/window.cpp:627: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

 

빌드를 하라는 메시지가 나타나서 당황하던 차에 현재 버전 4.0.1에 문제가 있는 것 같아 다음과 같이 pip명령을 이용하여 opencv-python을 재설치 해보았다. 

$ pip install opencv-python

버전을 확인해 보니 4.0.0이었다. 기존 버전에 비해 약간 낮은 버전인데 코드를 실행해 보았다. 

그랬더니 다음과 같이 윈도우가 나타나고 카메라 입력 영상이 보이는 것을 확인할 수 있었다.

 

 

 

 

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함