라즈베리파이에 OpenCV를 깔았으니 간단한 OpenCV 프로그램을 만들어보겠습니다. 간단한 엣지 검출 예제를 만들어보면서 소스 코드 편집, 빌드, 실행 방법등을 정리해보겠습니다. 


일단 저는 소스 코드 편집을 vi 에디터를 사용하는데요, 라즈베리파이에 기본으로 깔리는 vi는 정확하게 vim.tiny 입니다. 그런데 vim.tiny는 syntax coloring을 지원하지 않네요. 그러므로 vim 패키지를 새로 설치했습니다. 명령어는 sudo apt-get install vim 입니다.


프로그래밍 테스트를 할 폴더를 하나 만들고, 특히 OpenCV 관련 코딩을 모아놓을 폴더도 하나 만들도록 합니다. 새로 만들 예제 프로그램은 canny라는 이름의 디렉토리에 만들겠습니다.

pi@GoPiGo:~ $ mkdir coding && cd coding
pi@GoPiGo:~/coding $ mkdir opencv && cd opencv
pi@GoPiGo:~/coding/opencv $ mkdir canny && cd canny
pi@GoPiGo:~/coding/opencv/canny $


여기에서 vi main.cpp 명령을 입력해서 아래와 같이 소스 코드를 입력합니다.


이번에는 Makefile을 생성하고, 아래와 같이 내용을 입력합니다.

CC = g++
CFLAGS = -g -Wall
SRCS = main.cpp
PROG = $(notdir $(CURDIR))

OPENCV = `pkg-config opencv --cflags --libs`
LIBS = $(OPENCV)

.PHONY: all clean

$(PROG):$(SRCS)
    $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)

all: $(PROG)

clean:
    rm -f $(OBJS) $(PROG)

** 위에서 들여쓰기 되어 있는 부분은 TAB을 사용해야 합니다. **


이 Makefile은 현재 폴더에서 main.cpp 파일을 컴파일하고, OpenCV 라이브러리를 사용하고, 결과 파일 이름은 현재 디렉토리 이름과 동일한 형태로 생성합니다. 즉, 현재 디렉토리 이름이 canny이니까 main.cpp 파일을 빌드해서 canny라는 이름의 실행 파일을 생성합니다. Makefile을 이용해서 빌드를 하려면 터미널 창에서 make라고만 입력하면 됩니다.


순조롭게 canny 실행 파일이 생성이 되었습니다. 이제 ./canny 명령을 입력해서 실행을 하면 아래처럼 2개의 창이 나타나면서 캐니 엣지 검출 결과를 보여줍니다.


참 쉽죠??


그나저나 캐니 엣지 검출기의 실행 속도가 궁금해졌습니다. 그래서 소스 코드에 아래와 같이 캐니 엣지 검출기 실행 시간을 측정해봤습니다.

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
	Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);

	if (src.empty()) {
		cerr << "Image load failed!" << endl;
		return -1;
	}

	int64 t1 = getTickCount();

	Mat dst;
	Canny(src, dst, 50, 150);

	int64 t2 = getTickCount();
	cout << "It took " << (t2 -t1) * 1000 / getTickFrequency() << " ms." << endl;

	imshow("src", src);
	imshow("dst", dst);

	waitKey(0);
	return 0;
} 


위에서 getTickCount(), getTickFrequency() 함수를 조합해서 Canny() 함수의 실행 시간을 측정하였고, 그 결과는 아래와 같습니다.


자세히 보면 왼쪽 아래 터미널 창에 "It took 12.5726 ms." 라고 출력이 되어 있는 것을 볼 수 있는데요.. 512x512 크기의 영상에 대해서 12msec 정도 걸린 것이니 그렇게 아주 나쁘지는 않은 것 같습니다. 근데 몇 번을 더 해보니까 12ms 시간대로 나오는 경우는 거의 없네요. 대부분 16~24ms 정도로 측정이 되었습니다.



Posted by kkokkal
:

오랜만에 티스토리에 글을 쓰고 생각을 정리하다보니, 내가 쓴 글을 내가 다시 참고하는 경우가 생긴다. 그러다보면 글을 copy&paste 하는 경우도 생기는데, 뭐든 카피를 하면 뒤에 출처가 자동으로 붙어서 귀찮다.


예를 들어, 라즈베리파이에서 삼바 설치 명령어를 복사하고서 딴데다 붙여넣기를 하려고 하면 이렇게 뜨는건데,

sudo apt-get install samba samba-common-bin

출처: http://kkokkal.tistory.com/1294 [悠悠自適]

이게 무슨 의미가 있나 싶다. 어차피 딴데서 가져다 쓸때는 출처따위 지워버리면 그만인것을. 무엇보다 내가 귀찮아서 없애는 방법을 찾아보니.. 티스토리 관리자 페이지 플러그인 설정에서 바꿀 수 있었다.



이 플러그인을 설정해지하면 출처 텍스트가 함께 복사되지 않는다.


정말이지.. 저 텍스트 같이 복사하는 것이 무슨 의미가 있는지...


'Story > Open Diary' 카테고리의 다른 글

새 컴퓨터 조립  (0) 2017.02.26
내가 먹어 본 가장 맛있는 버거  (0) 2012.02.05
김밥  (0) 2011.07.19
Frozen Bubble 완파~!!  (0) 2010.10.08
태풍 뚫고 제주도  (2) 2010.09.08
Posted by kkokkal
:

라즈베리파이에서 OpenCV 3.2를 설치하는 방법을 정리해보겠습니다. 라즈베리파이에 OpenCV를 설치한다는 것은 OpenCV 소스 코드를 직접 빌드하여 헤더 파일을 복사하고 OpenCV 라이브러리를 생성하는 작업을 의미합니다. 과정이 좀 길지만 차근차근 알아보겠습니다.


OpenCV 소스 코드를 빌드하려면 빌드 관련 도구나 필요한 라이브러리 패키지를 라즈베리파이에 미리 설치해두어야 합니다. 예를 들어, 정지 영상 포맷과 관련된 jpeg 라이브러리나 png 라이브러리, 비디오 파일 포맷 또는 스트리밍 관련 라이브러리 같은 것들을 미리 설치해야 정상적으로 빌드됩니다.


[빌드 관련 도구 설치] 실제 빌드 작업에 앞서 OpenCV 빌드에 필요한 패키지를 설치합니다.

pi@RaspberryPi3:~ $ sudo apt-get install build-essential cmake pkg-config


[정지 영상 파일 입출력]

pi@RaspberryPi3:~ $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev


[비디오 파일 입출력/스트리밍]

pi@RaspberryPi3:~ $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
pi@RaspberryPi3:~ $ sudo apt-get install libxvidcore-dev libx264-dev libxine2-dev
pi@RaspberryPi3:~ $ sudo apt-get install libv4l-dev v4l-utils
pi@RaspberryPi3:~ $ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev


[GUI] OpenCV의 highgui 모듈에서 GTK를 사용하도록 합니다.

pi@RaspberryPi3:~ $ sudo apt-get install libgtk2.0-dev


[기타/최적화]

pi@RaspberryPi3:~ $ sudo apt-get install libatlas-base-dev gfortran libeigen3-dev


[파이썬] OpenCV를 빌드한 후 C/C++ 뿐만 아니라 Python으로도 프로그래밍을 테스트하려고 합니다. 개인적으로는 Python 2.x 버전을 사용하지 않고 Python 3.x 버전만 사용할 것이구요.. 이를 위해서 python3-dev 또는 python3-numpy 패키지가 필요한데, 얘네 둘은 이미 설치가 되어 있을 겁니다. (없으면 설치해야죠.)

pi@RaspberryPi3:~ $ sudo apt-get install python3-dev python3-numpy


[OpenCV 소스 코드 다운로드할 디렉토리 생성과 이동]

pi@RaspberryPi3:~ $ mkdir opencv && cd opencv


[OpenCV 3.2 소스 코드 다운로드 및 압축 해제]

pi@RaspberryPi3:~/opencv $ wget -O opencv-3.2.0.zip https://github.com/opencv/opencv/archive/3.2.0.zip
pi@RaspberryPi3:~/opencv $ unzip opencv-3.2.0.zip


[OpenCV 3.2 Extra 모듈 소스 코드 다운로드 및 압축 해제]

pi@RaspberryPi3:~/opencv $ wget -O opencv_contrib-3.2.0.zip https://github.com/opencv/opencv_contrib/archive/3.2.0.zip
pi@RaspberryPi3:~/opencv $ unzip opencv_contrib-3.2.0.zip


[빌드 작업을 위한 디렉토리 생성과 이동]

pi@RaspberryPi3:~/opencv $ mkdir build && cd build


[cmake 구성] 아래 명령어가 좀 긴데요, 대충 보면 예제 파일들을 생성하고, Python 2.x 말고 Python 3.x를 지원하도록 하는 등의 옵션을 지정합니다. Extra 모듈 소스 코드 위치를 지정하고, OpenCV 소스 코드 위치가 ../opencv-3.2.0/ 임을 명시합니다. 그리고 cmake가 동작하면서 나타나는 출력 메시지를 모두 cmake_messages.txt 파일에 기록합니다.

pi@RaspberryPi3:~/opencv/build/ $ cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_WITH_DEBUG_INFO=OFF \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=ON \
-DBUILD_TESTS=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-DINSTALL_C_EXAMPLES=ON \
-DINSTALL_PYTHON_EXAMPLES=ON \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.2.0/modules \
-DENABLE_NEON=ON \
-DWITH_LIBV4L=ON \
../opencv-3.2.0/ 2>&1 | tee cmake_messages.txt

참고로 cmake_message.txt 파일에 기록된 내용을 아래 [더보기]에 정리해두었습니다.


[빌드!!!] 이제 실제 빌드 작업을 진행합니다. 라즈베리파이3은 4개의 코어가 있지만, -j4 옵션을 주면 발열때문에 문제가 생길까봐 -j2 옵션으로 빌드를 진행합니다. 혹시라도 에러가 발생할까봐 컴파일 메시지는 build_messages.txt 파일에도 저장해둡니다. 빌드 작업은 2시간 넘게 걸렸던 것같고, 간간히 선풍기로 라즈베리파이 보드를 식히면서 진행했습니다.

pi@RaspberryPi3:~/opencv/build/ $ make -j2 2>&1 | tee build_messages.txt


[설치 및 설치 확인] 아래 명령어를 입력한 후 3.2.0 이 출력되면 정상적으로 설치가 된겁니다.

pi@RaspberryPi3:~/opencv/build/ $ sudo make install
pi@RaspberryPi3:~/opencv/build/ $ sudo ldconfig
pi@RaspberryPi3:~/opencv/build/ $ pkg-config --modversion opencv
3.2.0
pi@RaspberryPi3:~/opencv/build/ $ 


[Python 테스트] python3을 실행하여 OpenCV를 잘 불러오는지 확인해봅니다.

pi@RaspberryPi3:~/opencv/build/ $ python3
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> print(cv2.__version__)
3.2.0
>>> exit()
pi@RaspberryPi3:~/opencv/build/ $


잘 되네요~ :-)




Posted by kkokkal
: