설치
받은 파일을 실행해서 설치한다. 기본설정은 C:\Program Files\OpenCV으로 되어있으며 설치파일은
폴더를 환경변수에 Path등록과 bin폴더안에 calibfilter.ax,proxytrans.ax,syncfilter.ax 3개의 Activex를 등록한다.
registerall.bat를 이용하면 엑티브엑스 3개는 자동등록된다.
사용하기
1. 디버깅정보를 얻기위해서 다시 컴파일 해야된다. 설치폴더안에 _make폴더에서 opencv.dsw를 실행한다.
* Batch Build에서 필요한것만 체크하자.
cvaux.h파일의 1137 Line에서 주석처리를 잘못해서 에러가 난다.
//수정전
CvMemStorage* storage; /*storage for 밼oreground_regions\/ \
//수정후
CvMemStorage* storage; /*storage for Foreground_regions*/ \
-> Chapter6 예제(cvcam를 사용, facedetect예제와 ConsoleCV의 간단 예제를 이용해서 얼굴 추출을 구현한 예제)
facedetect.zip
-> 얼굴추출소스<444Page>, 6장 예제의 기본소스
(OpenCV 기본 Sample폴더에 있는 facedetect예제에 저자가 주석을 달아서 정리한것이다.)
얼굴 추출 알고리즘으로는 임의 영상에 대해 얼굴이 맞는지 아닌지 판단하는 것이 핵심인데, 템플릿 매칭 기반,
얼굴의 기하학적인 특징 기반, 신경망, SVM(Support Vector Machine), PCA(Principal Component Analysis :
주성분 분석), LDA(Linear Discriminant Analysis : 선형 판별 분석) 등 많은 알고리즘이 존재한다.
451Page
얼굴인식 - 얼굴 추출 후의 단계에 해당하며, 사람의 얼굴을 지문처럼 유일한 값으로 특징을 처리한 후, 많은 사람 중에서 특정한 얼굴 패턴을 갖는 살마을 쉽게 찾을 수 있는 과정이다. 1:N 매칭 얼굴인증 - 1:1 매칭으로 본인의 얼굴임을 확인하는 것이다.
얼굴 추출 알고리즘으로는 임의 영상에 대해 얼굴이 맞는지 아닌지 판단하는 것이 핵심인데, 템플릿 매칭 기반,
얼굴의 기하학적인 특징 기반, 신경망, SVM(Support Vector Machine), PCA(Principal Component Analysis :
주성분 분석), LDA(Linear Discriminant Analysis : 선형 판별 분석) 등 많은 알고리즘이 존재한다.
451Page
얼굴인식 - 얼굴 추출 후의 단계에 해당하며, 사람의 얼굴을 지문처럼 유일한 값으로 특징을 처리한 후, 많은 사람 중에서 특정한 얼굴 패턴을 갖는 살마을 쉽게 찾을 수 있는 과정이다. 1:N 매칭 얼굴인증 - 1:1 매칭으로 본인의 얼굴임을 확인하는 것이다.
- Davide Pizzolato가 개발한 영상 처리 라이브러리. - 2001년도 코드 프로젝에서 시작하여 오픈소스로 성장. - 플랫폼에 종속적이지 않고 무료이다.(win,linux,wince 등)
- C++클래스로 설계되어 있으며 영상 읽기, 저장, 보기, 영상 변환 등을 구현해놨고 Image resource, File, Memory 로 생성이 가능하다. - BMP,GIF,ICO,TGA,PCX,WBMP,WMF 가 지원되고, 그외 JPEG, PNG, MNG, TIFF 등의 포멧들은 추가 라이브러리가 필요하다. TIFF, JPEG, PNG, ZLIB, J2K 오픈 라이브러리와 연계되어 있음. - 배포형식이 full과 lite가 있는데 lite는 CxImage 소스만을 포함하고 있으며, full에는 다른 포멧이 요구하는 라이브러리가 (jpeg, png, zlib, 등등) 포함되어 있다.
클래스 구조 -(정성호,이문호 님의 책 p.120)
설치
다운로드에서 최신버젼을 받는다.
-> 현재 09년 7월 6.0이 최신이며 VS최신 .Net툴을 지원했다 안했다 한다;
GDIPlus는
닷넷의 그래픽 출력 엔진이다. 20년전에 C함수들로 설계된 GDI와는 다르게 C++클래스로 설계되었으며 XP이후에는 기본
출력엔진 역활을 한다. DLL파일 하나로 구성되어 있으며 C++컴파일러에서도 사용할 수 있어 C++사용자들은 GDI만으론
부족했던 부분을 GDI+를 사용으로 해결할 수 있게 되었다. (VC6사용자는 플랫폼 SDK설치를 하면 사용가능)
C#에서는 GDI+기본 클래스의 내용에 몇가지를 더하고 C#의 특성을 살려 C++보다는 좀더 편하게 사용할 수 있지만 다양한 그래픽 포맷으로 인해 외부 라이브러리를 찾아쓰던 VC사용자들에겐 적극 추천할 만한 라이브러리이다.
참고로 C#의 구조를 GTK#으로 구현하여 오픈소스화고 있는 Mono프로젝트에서의 그래픽 엔진은 윈도우에선 GDIPlus를 사용하고 Linux등에선 자체 GDIPlus같은 엔진을 만들어 사용하고 있다. C#을 사용해 보신분이라면 Mono를 사용해 한번쯤 리눅스 프로그래밍을 해보는것도 좋은 경험이라 생각한다. 참고 Mono의 System.Drawing.
VC에서 사용하기 위해선 GDIPlus초기화 과정이 필요하다. 아래 소스로 헤더파일 선언과 GDI+초기화 과정을 간단하게 정리했으며 CGdiPlusStarter
g_gps;를 위치와 상관없이 전역변수로 선언해놓으면 초기화와 해제과정을 자동으로 처리해준다. 배포시는 gdiplus.dll을 같은 폴더에 포함하기만 하면 95/98에서도 문제없이 사용할 수 있다.
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus")
.Net이 속도로 인해 GDIPlus라는 C++클래스 라이브러리를 만들었지만
GDI와 비교하면 확실히 속도는 떨어진다. 하지만 GDI+의 이미지 처리 클래스라던가 반투명 출력등의 기능은 GDI에는 없는
기능이고 이미지 출력같은 경우는 속도차이가 많이 나지 않는다. 그러므로 출력 품질을 위해서라도 GDI와의 연동하는 법을 배워
필요한곳에 적절히 사용하도록 하자.
아래에 GDI와 MFC, GDI+의 그래픽 처리 예제를 첨부했으며 예제를 실행해보면 시스템에따라 5~10배정도의 차이가 나고
출력부분을 반투명 처리할 경우는 700배정도의 차이가 난다.(위설명은 winapi사이트에 있는 그대로인데 필자의 시스템에선
GDI와 GDI의 차이가 2배 밖에 나지 않았다.)
Status 열거형 (2. 나 참고) GDI+의 모든 함수들은 Status 열거형으로 실행 결과를 리턴한다. 생성자로 로딩하는 Image 클래스의 에러 코드는 최후의 실패한 에러 코드를 리턴하는 GetLastStatus 함수를 사용하자. GdiPlusEnums.h 참고. Rect (2. 다 참고) GDI의 RECT 구조체는 LTRB 형식으로 좌상단, 우하단
좌표로 영역을 지정하지만 GDI+ Rect 클래스는 X, Y 좌상단 좌표와 폭, 높이인 Width, Height를 멤버로 가진다. 그래서 똑같은
(10,20)-(150,100)의 영역을 표현하는 방식이 다르다.
Color (3. 가 참고) GDI+는 색상을 Color 클래스로 표현한다. Color 클래스는 32비트의
정수로 색상을 관리하는데 8비트씩 잘라 A,R,G,B 요소를 표현한다. R,G,B는 각각 빨간색, 초록색, 파란색의 강도를 지정하며 A는 불투명도인
알파를 지정한다. 알파가 0이면 완전히 투명해서 보이지 않는 상태이며 255이면 불투명한 상태이다.
표준색상 - Color.Blue는 C#의 프로퍼티
Color Blue(0,0,255);
Pen P(Blue);
G.DrawEllipse(&P,10,10,100,100);
이렇게 끝낼 수 있다. C#의 문법을 이용해서 몇가지 편리한 클래스가 제공되는데 아쉽게도 C++에서 따라하기엔 저렇게 간결한 문장을 만들긴 어려운 편이다.
이상이 Winapi사이트 '3.나' 까지의 정리이다.
CImage
VC.Net 툴이상(VC 7.0)을 사용하면 "atlimage.h"안에 CImage라는 기본클래스가 존재하며 여러가지 기본포맷을 CBitmap으로 간단하게 가져올 수 있다. 이 클래스는 GDIPlus를
Wrapping한 클래스이며 클래스안에 CInitGDIPlus라는 GDIPlus초기화 클래스로 CImage의 Load함수만 호출하면 내부에서 CGdiPlusStarter 클래스와 같은 일을 자동으로 처리해준다.
영상처리 분야에 깊게 몸담고 있는 사람 중 한명으로서, 미래 진로에 대해 많은 고민을 하고, 주변 분들에게 물어보고, 검색 하면서 주워모은 지식으로 여러분들께 도움이 되고자, 또 같은 라인에 몸담고 계시는 분들에게 꿈과 희망을 심어드리고자 이 글을 작성하게 되었습니다. 잘못된 정보 수정이나 추가 내용은 언제든지 댓글 달아주시기 바랍니다.
Last updated : 2006.9.23
ps. 영상처리 쪽으로 진출하려는 후배들에게 좋은 자료가 될 수 있도록 현업에 계시는 분들도 많은 참여 부탁드립니다.
1. 삼성전자 삼성전자 DM 사업부에서 영상처리 전문 인력을 뽑는데 H.264 를 능가하는 Super AV 코덱을 개발하고 있습니다.
MPEG, 영상압축, 스트리밍 분야 공부하시는 분들에게 추천.
2. 보안 업체들 지문인식, 감시카메라 등과 같은 벤처 및 중소기업 업체들이 인력을 뽑는다고 종종 공시가 오곤 합니다. 많이들 가는 것 같습니다.
특징점 추출(Feature Extraction), 생체인식 분야 분들에게 추천.
3. 이미지 코드 인식 모듈 개발 업체들 아 이콘랩, 칼라집 과 같은 이미지코드(2D 바코드) 인식 모듈 개발 업체인데, SKT, LGT, KTF 등으로 휴대폰 업체에 주로 인식 모듈 납품하고 있습니다. 칼라집은 일본에서 성공하여 대도시 중심지의 전광판에 뜨기도 하고 TV 홈쇼핑 방송 하단에도 칼라코드가 송출되고 있습니다. 아이콘랩의 코드는 국내에서 쿠폰북 등에서 자주 볼 수 있습니다.
바코드 코드 인식, 칼라 코드의 경우 색상 분류(Color Classification) 관련 분야 분들에게 추천.
4. 메이저급 디지털 카메라 업체들 캐 녹 익서스, 소닉 사이버샷, 후지 파인픽스, 니콘 쿨픽스, 카시오 엑스슬림, 코닥 이지쉐어, 산요 작티, 코니카미놀타, 삼성 케녹스, 펜탁스 옵티오.. 유명한 업체들만 나열해도 굉장히 많네요. 이와 같은 업체들이 영상처리 인력을 아마도 가장 많이 필요로 하지 않을까 싶습니다.ISO 감도가 높아짐에 따라 노이즈가 생기는 문제를 각자 특유의 알고리즘으로 해결하고 있고CCD, CMOS 로 찍은 이미지도 그대로 저장하는 것이 아닌 화질 개선 처리를 통해 각자 고유의 특색을 보여주고 있습니다.서로 각자의 축적된 노하우라 공개도 잘 안한다고 하네요. 축적된 노하우라.. 엄청난 포스가 느껴지지 않습니까..?또 몇몇 디지털 카메라에는 얼굴 자동 초점 기능이 있는데 얼굴인식 모듈까지 들어가 있다는 얘기겠지요.영상처리 하는 사람들이 가서 할일들이 무진장 많아 보입니다.
모든 분들에게 추천. 주분야는 영상개선 쪽이겠지요.
5. 모니터 업체들 LCD 모니터 및 텔레비전 업체에서 화질개선 영상처리 인력을 필요로 합니다.LG 가 백색 가전으로 유명하죠. 엘지는 엑스캔버스, 삼성은 파브.
영상개선 분야 분들에게 추천.
6. 사진 관리 툴 개발 업체들 별 로 많진 않지만 유명한 몇군데 업체가 있지요.일단 구글 피카사(Picasa.com), 웹 2.0 으로 유명한 리야(riya.com)와 국내의 올라웍스(Olaworks.com) 등이 있는데 리야랑 올라웍스가 현재 얼굴인식 모듈이 들어가 있어서 사진을 얼굴로 찾아 검색하는 기능을 가지고 있습니다 리야는 웹기반, 올라웍스는 클라이언트 기반입니다. 구글 피카사 역시 조만간에 얼굴인식 혹은 그 이상의 기능을 가지고 나올 것으로 추측과 기대를 해 봅니다. 플리커(Flickr.com)도 사진 쪽으로 유명하지만 아직 아무런 소식이 없네요.
얼굴인식, 물체인식, 영상검색, 내용기반 검색, 특징 추츨 분야 분들에게 추천.
7. 의료 영상 업체 저희 학교 대학원의 경우 Database 방에서 오히려 적극적으로 이 분야에 뛰어들었더군요.
X-ray 나 MRI 촬영 등을 통해 얻은 사진을 의사고 보고 판단하면 의사도 사람인지라 조금씩 오차가 있기 때문에 영상처리를 하여 특징을 추출, 사전의 DB 를 검색하여 확실하게 판단된 병명들과 매칭하여 판단하는 그런 시스템혹은 MRI 촬영 사진을 3D 로 재구성 한다던지 이런 일들을 하더군요.
영상검색, 특징 추출, 매칭 분야 분들에게 추천.
8. 국방 연구소 정보가 많이 없어서 잘 모르겠습니다.
일 단 알고있는 바로는 영상처리 모듈을 직접 개발하는 것이 아니라이런 기술이 필요하다라고 위에서 결정나면 공개/비공개 입찰등을 통해서 수주주는 형태로만 알고 있습니다.국내의 경우 직접 개발하는 일은 거의 없다고 하던데, 좀더 정확하게 아시는 분 댓글 부탁드립니다.
9. 우주 영상처리 NASA 여긴 대체 어떻게, 또 누가 가나요..?
주변에 아는 사람이 없어서..
10. 로봇틱스 혼다 아시모(Honda Asimo), 소니 아이보(Sony Aibo), 소니 큐리오(Sony Qrio), 한국 카이스트 휴보(KAIST Hubo) 등이 로봇 분야의 대표적이며 영상처리가 핵심인력이 되는 곳이기도 합니다.
로봇의 눈이라는 가장 핵심적인 역할을 하는 부분이면서도, 다른 물리적인 제어, 재질, 배터리 부분들 역시 너무나 어렵기 때문에각각의 모든 분야 인력이 핵심이 되는 분야라고 할 수 있겠습니다.
케이스 바이 케이스이기 때문에 우리는 잡이 많을 수 밖에 없다. 즉 사람이 많이 필요하다.
이 말은 이쪽 분야에서는 어떤 문제를 풀기위해서는 문제를 파악하는 것이 젤 중요하다는 겁니다.
얼굴인식, 지문인식, 자동차 번호판 인식, 자동차 인식, 생체 인식, 문자인식, 반도체 공정에서 부품검사 등
모든것을 해본적은 없지만 수업시간에 대강 들은 내용만 가지고,
그리고 이쪽 분야에서 어떤 프로젝을 한번 끝내보셨다면 감이 대강 오실겁니다.
뭔가 일이 주어지면 요놈을 어떻게 해야하나 고민하셔야 합니다.
2. Feature 선택하기, 추출하기(Feature Extraction)
한국에서는 어떻게 표현하는지 모르겠습니다. 지문 분야에서는 특징점이라고도 부르는 것 같구요.
어떤 사물을 분간해 내기 위해서는 사물과 사물의 차이점을 알아야 합니다. 그 차이점을 가장 잘 나타내 줄수 있는것을
찾아야 하는게 그것을 Feature 라고 부르네요.
지문에서는 사람의 지문마다 있는 고유의 모양을 Feature라고 할 수도 있고, 얼굴인식에서는 잘 가공된
eigenface(eigenimage)의 값이 feature가 될수 있습니다.
Duda의 첫번째 예제는 salmon과 sea bass를 구분하는 예제입니다.
이 경우에는 우리는 색정보는 필요 없습니다. 그냥 고기의 크기만으로 쉽게 구분지어질 수 있기 때문에
컨베이어에서 사진을 찍은후에 크기를 잰후에 구분만 해주면 됩니다. 이 경우는 Feature가 image pixel의 length가 되겠습니다.
또 다른 예는, 색을 가지고 구분하는 간단한 프로젝을 한다면 R,G,B 칼라 스페이스가 Feature가 되고, 내 분야는 R,G,B로 구분이 안된다. H,S,V로 바꾸어서 보는게 더 좋다 하면 HSV가 되겠습니다. 난 다 필요없다, 흑백만으로 충분하다 하면 Gray 이미지가
Feature가 되겠구요. 이 개념이 넘 중요합니다.
또 추가하여 Feature Space를 Frequency 영역으로 넘어가면
보통 texture 검출에서 많이 쓴느데, FFT의 coefficient값이 Featrue가 될수도 있고
Wavelet의 각 Level당 coefficient값이 Featrue가 될수도 있습니다.
또한 그 Coefficient 중에서 대표점을 clustering을 이용하여 얻어내었다면 그점이 Feature가 될수 있구요.
Feature Extraction 자체도 하나의 연구분야가 되며 많은 알고리즘이 있습니다.
잘 선택된(또는 만들어진) feature space는 복잡한 알고리즘을 필요없게 합니다.
추가:
Feature의 dimension이 너무 많다. 그래서 feature 사이의 정보를 이용하여
필요없는 Feature를 줄이는 방법도 있습니다.
이것을 pre-processing 쯤에 들어가는데 이 방법이 PCA와 같은 방법입니다.
보통 3차원 이상의 데이터는 그림 그리기가 어려운데 이를 보여주기 위해서 PCA를 사용해도 됩니다,
그러면 중요한 데이터들은 보존되고 그림으로 볼 수가 있기 때문에 유용합니다.
3. 알고리즘 개발 (MATLAB)
저희는 OpenCV 동호회이긴 하지만
제가 직접 보고 경험한 대다수의 개발자들은 MATLAB에서 테스트를 합니다.
MATLAB을 공학툴입니다. Mathematica나 Maple 등도 들어보셨으리라고 생각됩니다.
이 세가지 툴을 모르신다면 대강 어떤 일을 하는지 웹사이트에서 찾아보시고
본인의 PC에 설치가 되어 있는데 잘 활용을 안한다 그러면 실행후 help혹은 demo 파일을 잠시 돌려보세요.
분명히 인터넷의 다른 문서에서 이 문제를 서술한 글이 있으리라 생각됩니다. 네이버 이용하지 마시고
구글로 찾으세요.
요즘은 전산과에서 조차도 알고리즘을 개발하는 분들은 MATLAB을 사용합니다.
이는 메모리 걱정도 없고, 이미 만들어진 많은 함수들 덕에(이 함수를 묶어 놓은 )
그를 기반으로 새로운 알고리즘 만들때에 시간을 많이 줄일 수 있기 때문입니다.
예를 들어 이미지 전체에 걸친 패턴매칭 알고리즘을 만든다고 할때 기본적으로 사용되는 for 루프는 4개 입니다.
for 루프 2개는 이미지의 height, width를 돌리는데 써야 하고
for i=1:1:height
for j=1:1:width
알고리즘
end
end
매칭할 패턴의 알고리즘을 그 안에 또 넣어야 하는데 또 2개의 for 루프가 필요하며
조건에 따라서 그 안에 if문이 복잡하게 들어갑니다.
적어도 4개의 for 루프문과 한개의 if문을 디버깅하고 값을 보려면 조심조심 하는수밖에 없습니다.
MATLAB에서는 이런 작업을 그나마 쉽게 할 수 있습니다.
이런 부분을 곧장 C에서 만들려면, 디버깅이 어려울 수도 있고 초보자는 논리적으로 무지하게 해멜 가능성이 큽니다.
갑자기 생각이 낫는데, MATLAB 홈페이지에서도 제가 지금 쓰고 있는 글과 같은
글을 본적이 있습니다. 케이스 설명으로 어떤 회사의 개발환경을 설명하는 것인데
최종 결과물은 소트프웨어지만 역시 '문제를 해결하는데는 MATLAB을 사용하여 요즘과 같이 개발시간 단축이
중요한 시점에서 다른 회사보다 빠르게 개발할 수 있었다.' 라는 글이였습니다.
대강의 문제 해결을 위해서라면 매트랩을 이용해서 알고리즘을 검증해 보세요.
곧장 OpenCV로 해결하려는 분은 C언어를 10년 이상하신 분한테나 어울리는 행동입니다.
OpenCV 자체에 대한 이해와 C언어적인 요소때문에 정작 중요한 문제 해결에 투자하는 시간을
많이 투자할 수 없습니다.
3-1 MATLAB Script
<MATLAB 간략소개>
매트랩은 실행파일이 안만들어지는 스크립트 언어(한줄씩 결과물을 볼 수 있음)라는 사실을 먼저 아세요.
고가의 매트랩이 설치되어 있는 PC가 아니고는 본인의 결과물을 확인해 볼 수 없습니다.
즉 자신의 결과물을 일반인에게 팔 수 없습니다. 하지만 학생버젼은 150불 정도밖에 안하구요,
학업을 위해서라면 암흑의 경로를 이용해도 쉽게 구할 수 있을 정도로 공학툴에서는 대중적인 소트프웨어 입니다.
매트랩은 책보다 그냥 헬프파일의 내용만 가지고 충분합니다.
MATLAB은 보통 배우는데 1주일이면 뒤집어 쓰고 하루 동안 헬프파일 읽고 따라하면 대강 느낌이
옵니다만(C에 비하면 무지하게 쉬움), 매트랩을 잘 활용하려면 역시 꾸준히 해도 늘 새로운 기능이 나오고 그렇습니다.
저도 틈틈히 메모와 다른사람 코드를 통해 배우고 있음.
우선 주어진 한장의 이미지를 가지고 스크립트를 만들어서 테스트 해보세요.
OpenCV에서 구현되는 대다수의 함수들이 Image Toolbox, Image Aquare Toolbox라는 이름으로 전부 구현되어 있습니다.
help 파일(영문)을 대강 읽어보면 사용법을 쉽게 알 수 있습니다.
따라서 이 함수들을 이용해서 주어진 문제를 해결하면 나중에 이를 OpenCV를 이용해서 해결할 수 있습니다.
매트랩에서 구현이 되었는데 OpenCV에서 구현이 안된 함수라면 MATLAB을 분석해서 openCV로 만들수도 있습니다.
대표적인 예가 histogrm에서 자동으로 Threshold value를 찾아주는 함수인데, 자주 쓰는건데 OpenCV에서 구현이 안되어 있습니다.
물론 야후에 가면 누가 만들어 놓은게 있지만... 여튼 이것도 매트랩 코드 보고 C로 만들어도 됩니다.
3-2 MATLAB Function
스트립트를 이용해서 문제를 해결했다면
이번에는 MATLAB Function을 만듭니다. (만드는 법은 help파일 참조)
입력과 출력이 있는 함수를 만든다음에 여러장의 사진으로 테스트 해봅니다.
다양한 테스트 이미지에서 자신이 만든 알고리즘을 검증을 하면서 필요한 부분을 보완합니다.
이때 머리 많이 돌아가고, 논문 거리가 될만한 아이디어가 떠올르기도 하고... 여튼 생각이 많아지고
다른 사람들과 순수 알고리즘에 대해서만 토론도 하게 되고 .. 뭐 그런 과정입니다.
하나의 문제를 해결하는데 부가 함수들을 많이 나누어서 재활용하는 루틴은 반듯이 함수화하는 습관을 길러야지
나중에 C로 만드는데도 효과적으로 할 수 있습니다.
3-3. 실제 데이터로 테스트(옵션).
이미지 한장이 입력인 경우에는 문제가 없지만
캠으로 반은 데이터를 처리하거나 초당 30프레임의 데이터를 처리해야 하는 어플리케이션의 경우에는
실시간급의 테스트를 반듯이 해봐야 합니다.
Iamge Acauring Toolbox를 보면 USB 캠데이터를 실시간을 쉽게 받아올 수 있고
코덱이 한정되어 있지만 AVI파일도 읽을 수 있습니다.
저 같은 경우는 테스트 환경 특성상 데이터를 테입으로 녹화한후에 그것을 AVI로 바꾸고
그것을 조그맣게 1분짜리 동영상으로 쪼개서 테스트 해봅니다.
MATLAB은 C에 비해서는 속도가 현저하게 낮기 때문에 프로세싱 시간이 좀 걸리고
프로그래밍 스킬이 부족하시면 속도가 많이 늦을 수도 있습니다. (아시는 분은 아는 이야기)
4. OpenCV에서 만들기
실제 프로젝을 하다보면 초보자와 경험자와는 시간의 분배가 많이 다를수 있습니다. 당연히 경험의 차이인데
초보자는
OpenCV의 인스톨부터, 하드웨어 인터페이스 문제,Linux를 사용한다면 Linux 자체를 배우기, PC 문제 등
별의별 자질구레한 문제까지 다 해결을 해야하기 때문에 정작 알고리즘 개발과 같은 부분에서는
시간을 많이 투자하지 못하는 경우가 생깁니다. 메모리 누수를 막을려고 투자한 시간이 알고리즘 개발에
걸리는 시간보다 더 많다면 효율이 많이 떨어지는 것이겠지요.
경험자는
대부분 그런 문제에 대해서 해결방법을 알기 때문에 좀더 근본적인 부분에 시간을 많이 투자를 할 수 있습니다.
또한 디버깅도 매우 현명하게 합니다. 여기에서 개발 시간차이가 꽤 날 수 있습니다.
따라서 게시판에 올라오는 글들을 보면, 처음에 많은 시행착오를 겪으시는 분들이
상당히 계시다는 것을 알 수 있는데, 이런 동호회를 통해서 그런 착오는 좀 줄이시고
그 경험을 나누면 다른 분들이 많이 도움을 받을 수 있을겁니다.
또한 그 경험은 사실 꼭 필요한 과정입니다. 없이 지나가는 것은 아닌것 같습니다.
그 자체로도 배우는게 많이 있습니다. 궁극적으로는 개발 자체에 시간을 투자할 정도의 스킬을 갖추셔야 할겁니다.
자질구레한 문제는 다 해결되었다는 가정하에
MATLAB으로 만든 여러 함수들을 OpenCV의 메뉴얼을 보면서 활용하시면 됩니다.
중간 중간의 결과물을 윈도우로 볼 수도 있고, 저장해서 이미지 뷰어 프로그램을 이용하여
확대해서 보면서 최종 소프트웨어를 만드시면 됩니다.
사실 별것 아닌 이야기를 사족을 많이 넣다보니까 길어졌는데
1. 주어진 문제를 어떻게 풀지 생각하고
2. 문제에 가장 적합한 Feature를 결정하고
3. MATLAB으로 알고리즘을 개발, 테스트 한 후에
4. OpenCV로 최종 결과물을 만들면 됩니다.
이 방법이 대부분의 비젼 개발자들이 주로 쓰는 방법이며
1. MATLAB에 대한 이해
2. C/C++ 언어에 대한 이해
3. OpenCV에 대한 이해가 갖추어 져야 합니다.
젊은 공학도에게는 커다란 청사진이, 다른 사람의 개발환경이 궁금하셨던 분들에게는
약간의 정보 공유가 되었으면 하는 바램입니다.
이 문서는 계속 수정, 보완됩니다.
역시 댓글로 자신의 노하우를 나누는 것 환영하며
저자신도 부족한 부분을 채우는데 많이 도움이 될 듯 합니다.
또한 잘못을 지적해 주셔도 되고, 구제적으로 언급되지 않은 문서에 대한 링크를 알려주기면 감사하겠습니다.
IJL(Intel JPEG Library)는 Intel에서 만든 JPEG 용 라이브러리로
Intel CPU에 최적화되어 Intel CPU에서 최적의 성능을 나타낸다. IJL 1.5 버젼까지 공개용이며 현재는
Intel에서 IJL에 대한 공식적인 지원은 하지 않고 IIPP의 일부로 포함되어 판매되고 있다. IIPP는 인텔에서 제공하는
여러 라이브러리(IPL, IJL, SPL,..)등을
하나로 통합한 것이다. 그러나 JPEG 이미지의 encoding/decoding용으로는 IJL1.5버젼에서도 충분히 그 효과적인
성능을 얻을 수 있다.
필자 테스트 결과 1.51버젼에 메모리릭 문제가
발생했다. 혹자는 포함(static)만 발생한다고 하는데 필자는 dll을 사용해도 발생했다. 고로 ijl최신버젼을 공짜로
사용하면 메모리릭이 발생한다. 필자는 현재 1.1버젼을 사용중이다. 몇가지 define선언관련이 변경된것 말고는 사용상의 문제는
없었다.