종합설계중간보고서 _1 - 네트워크기반수배차량인식프로그램 200511347 이태화 200811447 이재형
목차 1. 개발요구사항 2. 필요기술및사용라이브러리 3. 동작구조 4. 주요개발내용 5. 개발예정사항
1. 개발요구사항 1. 차량번호판이찍힌스크린샷을분석하여번호판인식 2. 인식된번호판을분석하여번호획득, 사용자로부터입력받은번호와비교 3. 두번호가일치하면현재영상전송모듈수행
1-1. 번호판인식 1. 차량의번호판을인식하기위해서차량이미지를로드하여이진화한다. 2. 이진화된이미지에서레이블링작업을수행하여번호판일수있는것들을인식한다. 3. 레이블링된것들중너무작거나큰것들을제외하여번호판이아닐확률이높은것들을제외한다. 4. 레이블링된것들각각을대상으로색상반전하여다시레이블링한다. 5. 다시레이블링된것의개수가 7 개이상인것들을번호판으로간주한다.
1-2. 번호획득 1. 번호판으로간주된것들을레이블링한다. 2. 레이블링된것들중너무작거나너무큰것들을제외하여숫자나문자가아닐확률이높은것들을제외한다. 3. 레이블링된것들의 x좌표와이미지를저장한다. -> 이미지는미리준비해둔템플릿 (0~9 숫자이미지 ) 의사이즈로리사이즈하여저장한다. 4.x 좌표를비교하여레이블링된이미지를앞의것부터순서대로정렬한다. 5. 인식률을높이기위하여이미지들을세선화한다. 6. 세선화된이미지와템플릿들을비교하여가장같은확률이높은것의숫자를값으로취한다. 7. 입력받은번호와비교하여 3 개이상일치하면영상전송모듈을수행한다.
1-3. 영상전송 개발예정
2. 필요기술및사용라이브러리 1.OpenCV 라이브러리 2. 레이블링 3. 세선화 4. 템플릿매칭 5.ffmpeg 라이브러리
2-1.OPENCV- 개요 Open Source Computer Vision 인텔에서만든강력한영상처리라이브러리 초급부터고급수준까지영상처리알고리즘을미리구현된함수로제공 VFW 라이브러리를활용해다시만든라이브러리제공 cv,cvaux,cxcore,highgui,ml,cvcam 등으로구성
2-1.OPENCV- 구성 Cv - 기본컴퓨터비전, 영상처리주요알고리즘관련함수 -cv.h, cvxxx.lib, cvxxx.dll (lib : 라이브러리파일, dll : 동적라이브러리파일로실행할때필요 ) cvaux 전문컴퓨터비전알고리즘함수 -cvaux.h, cvauxxxx.lib, cvauxxxx.dll cvcore - 영상행렬을포함한다양한데이터구조지원함수 cvcore.h, cvcorexxx.lib, cvcorexxx.dll highgui -gui 관련함수 ( 영상읽기, 윈도우관련, 마우스 / 키보드제어, 카메라 / 동영상처리 ) -highgui.h, highgui.lib, highgui.dll ml - 기계학습관련함수 -ml.h, ml.lib, ml.dll cvcam - 카메라관련입출력함수
2-1.OPENCV- 사용 API cvnamedwindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) ) : 윈도우생성 cvshowimage( const char* name, const CvArr* image ) : 윈도우에이미지출력 cvdestroywindow( const char* name ) : 윈도우제거 IplImage* cvcreateimage( CvSize size, int depth, int channels ) : 이미지생성 IplImage* cvloadimage( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR)) : 이미지로드 cvreleaseimage( IplImage** image ) : 이미지로드된메모리해제 cvsetmousecallback( const char* window_name, CvMouseCallback on_mouse, void* param CV_DEFAULT(NULL)) : 마우스이벤트를처리할콜백함수설정 CV_CDECL *CvMouseCallback (int event, int x, int y, int flags, void* param) : 마우스콜백함수 event -> CV_EVENT_MOUSEMOVE CV_EVENT_LBUTTONDOWN CV_EVENT_RBUTTONDOWN CV_EVENT_MBUTTONDOWN
2-1.OPENCV- 사용 API cvputtext( CvArr* img, const char* text, CvPoint org, const CvFont* font, CvScalar color ) : 이미지에텍스트삽입 CvPoint cvpoint( int x, int y ) {CvPoint p; p.x = x; p.y = y; return p;} : 픽셀위치 CvScalar cvscalar( double val0, double val1 CV_DEFAULT(0), double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0)) {CvScalar scalar; scalar.val[0] = val0; scalar.val[1] = val1; scalar.val[2] = val2; scalar.val[3] = val3; return scalar} : 칼라정보 (blue,green,red 순 ) cvresize( const CvArr* src, CvArr* dst, int interpolation CV_DEFAULT( CV_INTER_LINEAR )) : 이미지를목적이미지사이즈로리사이즈하여목적이미지에저장 CvSize cvgetsize( const CvArr* arr ) : 이미지사이즈획득 cvcvtcolor( const CvArr* src, CvArr* dst, int code ) : 색상영역을그레이등의다른컬러영역으로변조하여목적이미지에저장 Code -> CV_BGR2GRAY CV_RGB2GRAY CV_GRAY2BGR CV_GRAY2RGB cvwaitkey(int delay CV_DEFAULT(0)) : 키보드로입력이들어올때까지대기, 0 이면무한대기
2-1.OPENCV- 사용 API cvthreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ) : 이미지를이진화하여목적이미지에저장 ->threshold_type : CV_THRESH_BINARY = 임계값보다높으면최대값으로, 아니면 0 CV_THRESH_OTSU = OTSU 알고리즘에의해임계값을정하여이진화 CV_THRESH_BINARY_INV = cvrectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness CV_DEFAULT(1), int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0)) : p1 을좌상 p2를우하로하는사각형을이미지에그림 cvsetimageroi( IplImage* image, CvRect rect ) : 이미지에서 rect 영역을관심영역으로설정한다. CvRect cvrect( int x, int y, int width, int height ) {CvRect r; r.x = x; r.y = y; r.width = width; r.height = height; return r; } : 사각형영역지정 cvresetimageroi( IplImage* image ) : 관심영역해제
2-2. 레이블링 - 개요 레이블링 (Labeling) 이란? 인접한화소에모두같은번호 (Label) 를붙이고연결되지않은다른성분에는다른번호를붙이는일
2-2. 레이블링 - 구현 -> 컴포넌트레이블링 1 좌측상단부터검색하여최초로만난하얀픽셀 (value=255) 의값을 num=1 로설정현재픽셀의방문기록을 true 로설정 ( 모든픽셀의방문기록초기값은 false) 1 1 상하좌우인접한픽셀중값이 255 이고방문기록이 false 인픽셀의값을 1 로설정픽셀의방문기록 true, 이전좌표 (2,2) 로설정 1 1 1 상하좌우인접한픽셀중값이 255 이고방문기록이 false 인픽셀의값을 1 로설정픽셀의방문기록 true, 이전좌표 (2,3) 로설정
2-2. 레이블링 - 구현 -> 컴포넌트레이블링 1 1 1 상하좌우인접한픽셀중값이 255 이고방문기록이 false 인인픽셀이없으므로이전픽셀로돌아감 1 1 1 상하좌우인접한픽셀중값이 255 이고방문기록이 false 인인픽셀이없으므로이전픽셀로돌아감 1 1 1 이전픽셀이없으면루틴종료이어서다시 255 인픽셀을검색, 만나면 num=2 로위의루틴수행
2-2. 레이블링 - 구현 -> 임계값이하의컴포넌트삭제 레이블된컴포넌트의개수를줄이기위하여임계값이하의컴포넌트를삭제 컴포넌트레이블링루틴에서수행, 컴포넌트의시작위치와끝위치를구해냄 1 현재위치 (x,y) 를시작위치 (start_x,start_y), 끝위치 (end_x,end_y) 로설정 1 1 +x 방향으로갔을때 : x>=end_x 이면 end_x 를 x 로설정 1 1 1 +y 방향으로갔을때 : y>=end_y 이면 end_y 를 y 로설정
2-2. 레이블링 - 구현 -> 임계값이하의컴포넌트삭제 1 1 1 1 -x 방향으로갔을때 : Start_x>=x 이면 start_x 를 x 로설정 1 1 1 1 1 1 1 -y 방향으로갔을때 : Start_y>=y 이면 start_y 를 y 로설정 1 1 1 1 1 1 1 설정된시작위치에서끝위치까지 1 인픽셀의개수들을구하여임계값보다작으면 1 인값들을 0 으로바꾼다.
2-2. 레이블링 - 구현 -> 각각의컴포넌트정보저장 각각의컴포넌트정보를사각형영역을나타내는 opencv 구조체 (cvrect rect[component_num]) 에저장 true 1 1 2 2 1 1 2 2 좌측상단부터검색하여픽셀값이 0이아닌것을만나면해당컴포넌트의방문기록을 true 로설정하고컴포넌트의시작위치를현재위치로, 가로세로길이를 0으로설정 1 1 2 2 1 1 2 2 다음에만난픽셀이방문된컴포넌트의픽셀이면, 현재위치정보를이용하여해당컴포넌트의시작위치와가로세로길이를 update
2-2. 레이블링 - 구현 -> 각각의컴포넌트정보저장 true 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2
2-3. 세선화 세선화 (thinning) 란? 두께를가진이진이미지를그형태특성만남은즉두께가 1 인이미지로바꾸어주는것 템플릿매칭전에숫자이미지를세선화하여매칭확률을높일수있다. Zhang-Suen 세선화알고리즘을이용하여구현한다.
2-3. 세선화 - 구현 컴포넌트는 1 로배경은 0 으로변환 픽셀값이 1 인것에대하여 1. 주위픽셀들의연결성 ==1 2. 주위픽셀들중값이 1 인것의개수가 2 개에서 6 개 3. 별표친주위 픽셀들중적어도하나는값이 0 이다. 4. 별표친주위픽셀들중적어도하나는값이 0 이다. 픽셀값이 1 인것에대하여 1. 주위픽셀들의연결성 ==1 2. 주위픽셀들중값이 1 인것의개수가 2 개에서 6 개 3. 별표친주위 픽셀들중적어도하나는값이 0 이다.!!! 더이상지울것이없을때까지반복 4. 별표친주위픽셀들중적어도하나는값이 0 이다.! 모두만족하면픽셀값을지운다 모두만족하면픽셀값을지운다 1 은 0 으로 0 은 255 로변환
2-4. 템플릿매칭 세선화된번호이미지각각에템플릿번호이미지 (0~9) 모두를비교한다. - 두이미지의전체픽셀값을비교하여템플릿이미지의픽셀값이더작으면 count 를증가시킨다 이상적인경우에템플릿의픽셀값이항상같거나큼 같은숫자일수록 count 값이작게나올것이다. - 템플릿별로 count 를저장하고 count 순으로정렬한다. - 가장앞에정렬된템플릿의번호를취한다.
3. 동작구조 loop CAM 입력 스크린샷이미지 키보드 입력 입력번호 레이블링 blob blob blob 1 레이블링 2 3 비교 획득된번호 영상전송모듈수행 blob 개수가 7 이상인것 img1 번호판 레이블링 img2 img3 정렬 비교 템플릿이미지
4. 주요개발내용 - 레이블링함수
4. 주요개발내용 - 레이블링함수
4. 주요개발내용 - 레이블링함수
4. 주요개발내용 - 레이블링함수
4. 주요개발내용 - 레이블링함수
4. 주요개발내용 - 레이블링함수
4. 주요개발내용 - 이미지레이블링
4. 주요개발내용 - 이미지레이블링
4. 주요개발내용 - 이미지레이블링
4. 주요개발내용 - 번호판인식
4. 주요개발내용 - 번호판인식 Blob 7개 : 번호판으로인식
4. 주요개발내용 - 번호인식
4. 주요개발내용 - 번호인식
4. 주요개발내용 - 번호인식
4. 주요개발내용 - 번호인식
4. 주요개발내용 - 입력번호와비교
5. 개발예정사항 FFmpeg 인코딩디코딩 UDP 기반네트워크 진행예정
UDP(USER DATAGRAM PROTOCOL) 정보를보낸다는신호나받는다는신호절차를거치지않고, 보내는쪽에서일 방적으로데이터를전달하는통신프로토콜 수신측이데이터를보든상관없이송신측에서데이터만전달하면되는방식 무관계 ( 無關係 ) 서비스라하고, 이무관계서비스의통신규약이 UDP 이다 UDP에서는세션을설정하지않고데이터를상대의주소로송출한다. UDP의특징은프로토콜처리가고속이라는점이다. 그러나 TCP와같이오류정정이나재송신기능은없다. 신뢰성보다도고속성이요구되는멀티미디어응용등에서일부사용된다
FFMPEG FFmpeg 은디지털음성스트림과영상스트림에대해서다양한종류의형태로기록하고변환하는컴퓨터프로그램 이다. 이프로젝트의이름은 MPEG 영상표준화그룹에서유래했고, "mpeg" 앞에붙은 "FF" 는 "fast forward" 를의 미한다. 이프로젝트는 'Fabrice Bellard' 에의해시작되었고, 지금은 'Michael Niedermayer' 에의해서지속되고있 다. 수많은 FFmpeg 개발자들이 'MPlayer' 프로젝트에포함되어있고, 'FFmpeg' 는 MPlayer 프로젝트서버 를호스팅하고있다. FFmpeg 은리눅스기반으로개발되었지만, 애플, 윈도, 아미가 OS 등대부분의운영체제에서컴파일이가능하다. FFmpeg 은명령어를직접입력하는방식으로동작하며여러가지자유소프트웨어와오픈소스라이브러리로구성되 어있다. 라이브러리중에는 libavcodec 도들어있는데, 이라이브러리는음성 / 영상코덱라이브러리로여러프로젝 트에서쓰이고있다. 또, libavformat 라는음성 / 영상다중화, 역다중화라이브러리도있다.
FFMPEG TOOLS & LIBRARIES FFmpeg provides various tools: ffmpeg is a command line tool to convert multimedia files between formats. ffserver is a multimedia streaming server for live broadcasts. ffplay is a simple media player based on SDL and the FFmpeg libraries. ffprobe is a is a simple multimedia stream analyzer. and developers libraries: libavutil is a library containing functions for simplifying programming, including random nu mber generators, data structures, mathematics routines, core multimedia utilities, and muc h more. libavcodec is a library containing decoders and encoders for audio/video codecs. libavformat is a library containing demuxers and muxers for multimedia container formats. libavdevice is a library containing input and output devices for grabbing from and renderin g to many common multimedia input/output software frameworks, including Video4Linux, Video4Linux2, VfW, and ALSA. libavfilter is a library containing media filters. libswscale is a library performing highly optimized image scaling and color space/pixel for mat conversion operations. libswresample is a library performing highly optimized audio resampling, rematrixing and sample format conversion operations.
FFMPEG 관련참조 전역함수레퍼런스 http://ffmpeg.org/doxygen/trunk/globals_func.html AVCodecContext 구조체레퍼런스 http://ffmpeg.org/doxygen/trunk/structavcodeccontext.html#7abe7095de73df98df4895bf9e25fc6 b AVPacket 구조체레퍼런스 http://ffmpeg.org/doxygen/trunk/structavpacket.html libavcodec/h264.h 파일레퍼런스 http://www.ffmpeg.org/doxygen/trunk/h264_8h.html ffmpeg 파일목록 http://www.ffmpeg.org/doxygen/trunk/files.html ffmpeg 와 SDL 튜토리얼 http://dranger.com/ffmpeg/tutorial01.html
FFMPEG 관련참조 참조사이트 ( 인코딩 / 디코딩 ) FFmpeg 을이용한 Android 동영상플레이어개발 http://helloworld.naver.com/helloworld/8794 ffmpeg 비디오디코더 (decoder) 사용법 - how to use ffmpeg video decoder http://greenday96.blogspot.kr/2011/07/ffmpeg-decoder.html Using libavformat and libavcodec http://www.inb.uni-luebeck.de/~boehme/using_libavcodec.html x264 옵션값 http://yg05123.blog.me/70042737774 FFmpeg 에 x264 인코더사용방법 http://iamlow.tistory.com/entry/ffmpeg%ec%97%90-x264-%ec%9d%b8%ec%bd%94%eb%8d%94- %EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95 ffmpeg 의 api-example 을기반으로한 mpeg 인코딩방법 ( 인코딩시나리오파악용으로참조했다 ) http://blog.daum.net/thflfkaus/6
참고자료 http://ffmpeg.zeranoe.com/builds/ http://www.ffmpeg.org/ http://trac.ffmpeg.org/wiki http://opencv.org