라즈베리파이에 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
: