Home » 산딸기 가지고 놀기 » Archlinux + OpenCV 영상처리

 

아래 글은 네이버카페 “라즈베리파이” 바람 님께서 공개 동의하에 제공 해 주신 글 입니다.

 

Archlinux + OpenCV 영상 처리

(Arch linux + OpenCV video stream)

 

1. 개요

라즈베리파이와 웹캠을 이용하여 로봇의 센서 역할을 위해 Archlinux와 OpenCV를 사용하여 로봇 제어를 목표로 하고 있으며 Archlinux는 여러보드에 포팅되어 있어서 서로 다른 보드를 사용하더라도 동일한 환경을 구축할 수 있어서 좋은것 같습니다.
간단히 웹캠 이미지를 OpenCV로 처리하는데는 320×240으로 10프레임 전/후가 되어서(처리량이 늘어날수록 프레임 저하 발생) 빠르지는 않지만 느린속도로 로봇 제어 가능할거라 생각이 들고, 만약 속도가 만족스럽지 않다면 라즈베리파이 이외에 속도가 빠른 보드를 사용하여 동일한 환경으로 구동할 수도 있겠습니다.아래는 Archlinux를 설치했다는 가정하에 시험 방법을 간단히 설명드리겠습니다.

 

2. 시스템 환경

 

opencv_usb

3. 시스템 구성

  • 라즈베리 파이(256M)
  • 마이크로 소프트 HD-5000 웹캠 카메라
  • 몇 년 전 구입했던 이름모를 USB 무선랜
  • 이미지 캡쳐 해상도 320×240
  • 사용 OS는 Archlinux

 

4. OpenCV 설치하기

# pacman -S opencv opencv-samples

 

5. 개발 환경 설치

OpenCV C++ 파일을 라즈베리파이에서 직접 컴파일 하기 위해서 설치가 필요합니다.
# pacman -S base-devel

 

6. mjpg-streamer 설치

Archlinux는 기본적으로 Consol 기반으로 OpenCV 처리 결과를 보기가 힘듭니다. 따라서 mjpg-streamer 를 이용하여 웹으로 스트리밍 하여 결과 이미지 확인을 합니다.
# pacman -S mjpg-streamer-svn

 

7. OpenCV 프로그래밍

OpenCV를 사용하여 빨간색 물체를 찾는 간단하게 해 보겠습니다. 아래 코드는 제가 인터넷에서 찾은 자료를 일부 수정한 내용입니다.
간단히 캡쳐 이미지를 YCrCb로 변환 후에 컬러채널을 분리하고 붉은색 채널을 이진화 하여 붉은색이 강한 부분만 표시하도록 합니다. 그리고 영상의 모멘트를 구하여 중심점을 구하게 되는데 이부분은 개선이 필요합니다. 향후 라벨링을 통해서 여러 붉은색 물체가 나타나도 구분을 할 예정입니다.
관련 프로그래밍 파일은 별도로 첨부하였습니다.

 

// 카메라로 부터 1프레임 이미지를 읽어온다.
frame = cvQueryFrame(capture);

// YCrCb 형태로 변경
cvCvtColor(frame, image, CV_RGB2YCrCb);

// 채널별로 분리
cvSplit(image, img_blue, img_green, img_red, NULL);
cvMaxS(img_red, threadhold_red_value, img_red);

// 이진화
cvThreshold(img_red, img_bin, threadhold_bin_value, 255, CV_THRESH_BINARY);

// 팽창
cvDilate(img_bin, img_dst, NULL, 4);

// 침식
cvErode(img_dst, img_dst, NULL, 4);

..
..

 

8. OpenCV 컴파일

OpenCV 프로그래밍 파일이 red_detect.cpp 인경우 아래와 같이 컴파일 하고 실행 하면 됩니다. 라즈베리파이가 성능이 높지 않아서 컴파일 해보면 많이 느리다고 느끼실겁니다.
# g++ -g -Wall -o red_detect red_detect.cpp `pkg-config opencv --libs --cflags`
# ./red_detect

 

9. OpenCV 처리 결과 확인

OpenCV 결과는 mjpg-streamer를 사용하여 웹브라우져로 확인합니다. mjpg-streamer는 특정 디렉토리의 jpg파일을 웹으로 스트리밍 할 수 있음으로 OpenCV 처리 결과를 jpg이미지 파일로 특정 디렉토리로 저장을 연속으로 하여 웹페이지로 스트리밍되는 이미지로 확인 가능합니다.
OpenCV 처리 결과로 2개의 이미지를 2개의 디렉토리에 별도로 저장하여 mjpg-streamer를 2번 실행하여 in/Out 등의 이미지를 동시에 확인할 수도 있습니다.
아래와 같이 2개의 이미지를 별도 폴더에 저장합니다.
cvSaveImage(“/srv/cam.jpg”,frame);
cvSaveImage(“/srv/http/out.jpg”,img_dst);
 
프로그램을 컴파일 후에 실행한 상태에서 첫번째 mjpg-stremaer를 실행하고 이때 포트는 8080으로 설정합니다.
# mjpg_streamer -i “input_file.so -f /srv/http/” -o “output_http.so -p 8080 -w /srv/”
 
두번째 결과이미지 스트리밍은 아래와 같이 실행합니다. 포트는 첫번째 스트리밍과 구분을 위해 8081로 설정합니다.
# mjpg_streamer -i “input_file.so -f /srv/” -o “output_http.so -p 8081 -w /srv/”
 
웹페이지에서 OpenCV결과 이미지를 확인합니다.
http://192.168.0.43:8080/?action=stream
http://192.168.0.43:8081/?action=stream
 

 

 

 

산딸기마을 포스트 검색

공동제작 공동프로젝트 무상후원 기관

산딸기마을 기부하기

산딸기마을 방문자 현황

Flags Countries Visits Page views
South Korea 626063 1845660
United States 10882 26091
Japan 5011 13204
Germany 2755 5151
India 1897 2902
Canada 1729 4640
United Kingdom 1596 2642
Australia 1240 2901
Russia 1219 1677
China 1077 2239
Total Pageviews: 1936700