6/11/2011

자동 차종 분류

. 구현 플랫폼

  • C# - 코드 작성에 사용
  • Windows 7 - OS
  • VisualStuio2010 – 코드 개발에 사용
  • EmguCV – openCV 라이브러리의 C#버전, 이미지 프로세싱에 사용
  • .NET Framework v3.5 – 개발 프레임워크

     

    나. 구현 목표

    본 프로젝트는 아래 표와 같이 차종을 분류하는 것을 목표로 한다.

    image
    그림 1. 차량 분류표

     

    자동차 제원 설명

    image
    그림 2. 자동차 제원 관련 용어

  • 전장: 자동차의 앞쪽 끝에서 뒤쪽 끝부분까지의 수평길이
  • 전폭: 자동차의 가로폭이 가장 넓은 부분 수평폭
  • 전고: 자동차의 접지면으로부터 가장 높은 부분까지의 높이
  • 축거: 앞 차축의 중심점과 뒤차축의 중심점 사이의 거리
  • 윤거: 왼쪽 타이와 오른쪽 타이어의 중심점 사이의 거리
  • 차축: 바퀴 축의 개수

    위 자동차 제원중 본 프로그램에선 전폭, 전고, 차축을 이용해 차종을 구분한다.

     

    차량 분류 순서

    아래와 같은 방식으로 차량을 분리한다.

    image
    그림 3. 차량 분류 순서도

     

    다. 프로그램 소개

    1) UI부분

    프로그램 UI는 다음과 같이 구성되어 있다.

    좌측: 자동차 썸네일 이미지(상), 자동차 이미지 프로세싱 결과(중), 분석결과(하)
    우측: 옵션(도움말, 이미지 폴더지정, 이미지 프로세싱 옵션, 차종분류 옵션)

    본 프로그램은 선택된 폴더 안의 [5자리 숫자]_[side | front].jpg 과 같은 형식을 가지는 파일명만을 불러온다. (ex- 00111_side.jpg, 00001_front.jpg)

    image
    그림 4. 프로그램 UI

     

    2) 전면사진을 통한 차량의 상대적인 높이, 너비 측정

    image
    그림 5. 전면사진 이미지 프로세스 과정

     

    2-1) 전면사진 분석 과정

    전면사진을 통해 차량의 상, 하, 좌, 우를 검출하고 이를 토대로 높이와 너비를 계산하는 순서는 ‘그림 5. 전면사진 이미지 프로세스 과정’과 같다. 이 과정을 다시 글로 설명하면 아래와 같다.

    · 차량의 전면 원본사진을 얻는다.

    · 원본사진을 흑백사진으로 변환한다.

    · 변환된 흑백사진을 가지고 Canny Edge 검출을 수행한다.

    · 검출된 가장자리 사진을 가지고 Hough Line 검출을 수행한다.

    · 검출된 라인들 중에서 가로(파랑), 세로(빨강) 라인 성분만을 추출한다.

    · 추출된 라인들 중에서 가장 왼, 오른, 위, 아래쪽 가장자리를 추출한다.

          o 왼쪽: Point(x, y)중에서 x값이 가장 작은 세로 라인을 찾는다.

          o 오른쪽: Point(x, y)중에서 x값이 가장 큰 세로 라인을 찾는다.

          o 위쪽: Point(x, y)중에서 y값이 가장 작은 가로 라인을 찾는다.

          o 아래쪽: Point(x, y)중에서 y값이 가장 큰 가로 라인을 찾는다.

    · 추출된 상, 하, 좌, 우 라인을 원본이미지에 그린다.

     

    2-2) 전면사진 분석 관련 매개변수

    Canny Edge 검출을 위해 사용하는 매개변수는 아래와 같다. 이 매개변수는 Hysteresis의 Khigh 와 Klow 에 해당한다.

    · cannyThreshold: Khigh. Edge Chain의 시작점을 결정할 때 쓰이는 Threshold Value

    · cannyThresholdLinking: Klow. Edge Linking을 할 때 쓰이는 Threshold Value

     

    Hough Line 검출을 위해 사용하는 매개변수는 아래와 같다.

    · rhoResolution: 위 Hough Space 식에서 d의 간격

    · thetaResolution: 위 Hough Space 식에서 θ 의 간격

    · threshold: 추출하고자 하는 라인픽셀의 합

    · minLineWidth: 추출하고자 하는 라인의 최소 길이

    · gapBetweenLines: 추출하고자 하는 라인들 사이의 최소 길이

     

     

    3) 측면사진을 통한 차량의 차축 측정

    image
    그림 6. 측면사진 이미지 프로세스 과정

    3-1) 측면사진 분석 과정

    측면사진을 통해 차량의 바퀴 개수를 검출한다. 바퀴를 검출하는 순서는 ‘그림 6. 측면사진 이미지 프로세스 과정’과 같다. 이 과정을 다시 글로 설명하면 아래와 같다.

    v 차량의 바퀴 주변 사각영역을 추출하는 과정

    · 차량의 측면 원본사진을 얻는다.

    · 원본사진을 흑백사진으로 변환한다.

    · 흑백사진의 각 Row마다 Intensity 변화율을 검사해 바퀴부분이 있는 Row를 검출한다. 각 Row마다 다음 작업을 수행한다.

    o Row[x] 와 Row[x+1] 의 Intensity 차이가 사용자가 지정한 RowChangeRate를 넘으면 Count를 증가시킨다.

    · 각 Row에서 검출된 Count의 평균을 구한다.

    · 각 Row마다 ‘Count평균+10’보다 큰 Count를 가지는 Row들을 추출한다.

    · 위 과정을 통해 추출된 Row들에서 상한과 하한을 정한다.

          o 상한: 해당 Row아래로 사용자가 지정한DetectRange사이에 줄이 또 존재하면 상한으로 설정 (줄이 없다면 노이즈로 판단해 무시)

          o 하한: 해당 Row 위로 사용자가 지정한 DetectRange 사이에 줄이 또 존재하면 하한으로 설정 (줄이 없다면 노이즈로 판단해 무시)

    · 검출된 상한과 하한을 가지고 바퀴 주변영역을 표시한다. (그림 6. (c)참조)

    ·

    v 위에서 추출된 바퀴 주변 영역에서 바퀴를 추출하는 과정

    · 빼기 이미지 프로세스를 통해 ‘그림 6. (d)’와 같은 그림을 얻는다.

    · 얻어진 그림에 Hough Circle 검출을 수행한다.

     

    2-2) 측면사진 분석 관련 매개변수

    바퀴 주변영역 추출을 위해 사용하는 매개변수는 아래와 같다.

    · rowChangeRate: p(x, y)와 p(x+1, y)의 Intensity 차이가 rowChangeRate보다 크면 Count를 증가시키는 역할.

    · detectRange: 바퀴 주변영역의 상한과 하한을 정할 때 사용하는 변수

     

    2-3) 측면사진 바퀴 주변영역 추출원리

    바퀴 주변영역을 추출하는 과정에 대해 좀 더 알아보자.

    image
    그림 7. 바퀴 영역 밖의 Intensity 변화율

    image
    그림 8. 바퀴 영역의 Intensity 변화율

    image
    그림 9. Intensity 변화율에 따른 Row 분포

    ‘그림 7’ 과 ‘그림 8’을 비교해 보면 바퀴 영역에서 Intensity의 변화가 심한 것을 알 수 있다. ‘그림 9’에서는 Intensity 변화율이 큰 Row는 녹색으로 설정하고, Intensity 변화율이 평균인 Row는 분홍색으로 설정하였다.

    이렇게 추출된 녹색 Row들에서 상한과 하한을 정하고 ‘그림 6. (c)’ 처럼 바퀴 주변영역을 정하게 된다. 바퀴 주변영역이 정해지면 Hough Circle을 통해 바퀴부분을 추출한다.

     

     

    . 결과 분석

    1) 프로그램 테스트

    인천 연안부두, 인하대학교 주변에서 직접 찍은 차량의 전면, 측면 사진을 기반으로 프로그램 테스트를 실시했다.

    직접 찍은 사진의 경우 배경으로 인해 정확한 결과를 추출할 수 없었다. 따라서 차량 외의 배경 부분을 단순화 시켰고, 아래의 실험결과를 얻을 수 있었다.

    image
    그림 10. 경차(6종) 분류 결과 1

    image
    그림 11. 경차(6종) 분류 결과 2

    image
    그림 12. 2종 차량 분류 결과

    image
    그림 13. 1종 차량 분류 결과

    image
    그림 14. 5종 차량 분류 결과

    주어진 그림 모두 알맞은 차종을 분류한 것을 확인할 수 있다.

     

    2) 개선점

    ㄱ. 정확한 자동차 제원 측정

    테스트에 이용했던 사진은 사진기와 차량간의 거리가 일정하지 않아 자동차의 제원을 측정하기가 어렵다. 하지만 톨게이트와 같은 장소에서 사진기를 설치하고 일정 위치에 자동차가 위치했을 때 사진을 찍는다면, 차량의 정확한 제원을 파악할 수 있을 것이다.

    또 다른 대안으로는 Stereo Camera를 이용해 자동차 제원을 분석하는 방법도 있다.

    ㄴ. 복잡한 배경으로 인한 자동차 검출의 어려움

    프로그램 테스트에서 이용한 이미지는 각기 다른 배경을 가져 차량만을 인식하기 힘들기 때문에 배경을 단순화 시켜 테스트했다. 하지만 실제로는 톨게이트와 같은 고정된 장소에서 차량을 분류하므로 Image Subtraction을 통해 배경을 제거한 차량 이미지를 얻을 수 있다.

    또 다른 대안으로는 Face Recognition과 같은 방식으로 차량 인식을 통해 배경을 제거할 수 있다.

    ㄷ. 정교한 바퀴영역 추출의 어려움

    바퀴 사이에 원과 비슷한 도형이 있으면 그것 또한 바퀴로 인식되므로 이를 피하기 위해서 가로 Intensity 변화만을 감지했던 기존 프로그램에 세로 Intensity 변화 감지를 더해 바퀴 영역을 추출할 수 있다.

     

    소스코드 및 실행파일 보러가기

  • Simple Video Security

    프로그램 시연영상: Release_mode.avi

    소스코드VideoSecurity.zip

    프로그램 실행파일program.zip

     

    1. 개발환경

    . 개발 언어: C#

    . 개발 툴: Visual Studio 2010 – Windows Version

    . 기타요소

    — EmguCV Library

    — .NET Framework v3.5

    — Logitech QuickCam S7500

     

    2. 프로젝트 소개

    . 목표

    본 프로그램은 침입자가 있는지 검사해주는 프로그램이다. 빈 사무실 같은 곳에 프로그램을 가동시키면, 기준 영상에 변화가 생기면 침입자가 들어온 것으로 판단해 해당 영상을 PC에 저장한다.

    . Flow

    1. 비디오 스트림으로부터 인풋 이미지를 캡쳐한다.
    2. 받아온 인풋 이미지를 Gray 이미지로 변환한다.
    3. 기존 이미지에서 인풋 이미지를 뺀다.
    4. 3번 결과로 나온 이미지를 Thresholding 한다.
    5. 4번 결과로 나온 이미지를 모폴로지 연산을 통해 노이즈를 제거한다.
    6. 변화된 부분의 비율을 검사해 일정 비율 이상이면 침입자가 발생한 것으로 판단해 이미지를 저장한다.

    Video Security 프로그램은 ‘그림 1. 일반적인 영상처리 프로세스’를 참고해 영상처리 프로세스를 생성했다. Video Security 프로그램의 영상처리 프로세스는 ‘그림 2’에서 확인할 수 있다.

    image
    그림 1. 일반적인 영상처리 프로세스

     

    image
    그림 2. Video Security 프로그램 영상처리 프로세스

     

    . UI

    • 검사 시작 버튼: 웹캠으로부터 실시간으로 영상을 받아들인다.
    • 기준영상 등록 버튼: 현재 웹캠으로부터 받아들이는 한 Frame의 영상을 캡쳐해 비교대상 사진으로 씀
    • 영상 크기조절 트랙 바: 웹캠으로부터 받아들이는 영상의 크기를 조정한다.
    • 검출결과 저장위치 설정 버튼: 검출결과 저장 폴더를 설정하는 버튼이다.
    • 카메라 입력: 웹캠으로부터 받아들이는 영상이 출력되는 곳
    • 기준영상: 기준영상 등록 버튼을 통해 입력된 기준 영상이 보여지는 곳
    • 기준 영상과 현재 영상의 차: 기준영상 – 현재 인풋영상의 Gray 이미지를 출력하는 곳
    • 잡음제거 영상: 차 영상을 모폴로지 연산을 통해 잡음을 제거한 영상

    image
    그림 3. Video Security 프로그램 UI

     

     

    . 프로그램 실행 결과

    그림 5처럼 침입자가 발생하면 왼쪽 위의 이미지를 지정된 폴더에 저장한다.

    image
    그림 4. 기준 영상이 등록된 프로그램 실행 화면



    image
    그림 5. 침입자가 발생했을 때 프로그램 실행 화면

    HTTP Live Streaming을 사용한 원격 TV 서버

    1. 프로젝트 소개

    · 웹을 통해서 생방송을 실시간으로 원격 TV를 시청할 수 있다는 것을 의미

    · 외부에서도 인터넷에 연결된 단말기만 있으면 TV시청가능

    · HDTV 카드 사용 (FusionHDTV7 USB Home)

    · Ubuntu v10.10 & 아파치 서버

    · 언어: C, 루비

    시연 - 시연영상.avi

    1. 동영상 파일(실시간 TV영상)을 우분투환경에서 인코딩 및 세그멘테이션 및 인덱스 파일 생성

    2. 인코딩 및 세그멘테이션 된 파일들과 인덱스 파일을 아파치 서버에 저장

    3. 클라이언트(아이폰, 아이팟터치)가 웹페이지를 통해 아파치 서버의 인덱스 파일에 접속

    4. 클라이언트에서 스트리밍 영상 시청

     

    2. HTTP Live Streaming 소개

    image

    3. 시스템 구성 및 특징

    . Server –> Client

    · 전체적인 구성

    TV카드를 서버와 연결

    TV카드로부터 받은 신호를 Server에서 처리하여 인터넷을 통해 단말기로 전송

    image

     

    · 서버 흐름

    서버에서 알맞은 대역폭들의 미디어 파일들을 생성하고 클라이언트는 자신의 인터넷 상황에 알맞은 대역폭 파일들을 다운로드 해 재생

    (ex- 인터넷 속도가 느린 경우 저화질 미디어 파일 다운로드)

    image

     

    · 서버의 기능

    서버는 TV카드로부터 MPEG –Transport Stream을 전달받음

    트랜스코더 역할인 FFmpeg으로 인코딩을 수행 (Using H.264 / AAC or mp3 Codec)

    / 중/ 고화질로 인코딩

    인덱스 파일 생성

    인코딩이 완료된 파일을 가지고 segmentation

    (Segmentation: 동영상을 일정 시간을 주기로 분할하는 작업)

    image

     

    · 인덱스 파일

    M3U8 확장자를 가짐

    MP3 Playlist File인 M3U 확장자 파일을 확장한 버전

    구성요소 - http://tools.ietf.org/html/draft-pantos-http-live-streaming-05 참조

     

    image동영상이 10초씩 Segmentation되어 3개의 파일이 생성되었을 때
    각 대역폭(저/중/고화질)을 포함하고 있는 메인 인덱스 파일

     

    image동영상이 10초씩 Segmentation되어 3개의 파일이 생성되었을 때
    고화질 인덱스 파일

     

    . Client –> Server

    인터넷을 통해 메인 인덱스 파일을 링크한 서버의 HTML 페이지에 접근

    메인 인덱스 파일은 클라이언트 인터넷 환경에 맞춰 해당 대역폭의 인덱스 파일에 접근

    해당 대역폭의 인덱스 파일이 포함하는 미디어 파일 다운로드

    image

     

    4. 프로젝트 산출물

    각 시간에 따라 서버에 자동으로 인덱스 파일들과 Segmentation 된 미디어 파일들의 생성

    image

    Virtual Factory

    1. 개발환경

    . 개발 언어: C#

    . 개발 툴:

    — Visual Studio 2010 – Windows Version

    — Visual Studio 2008 – ActiveX Version

    . 기타요소

    — Microsoft Visual C++ 2008 Redistributable

    — .NET Framework v3.5

    — EmguCV Library 사용

    ㄹ. 개발기간

    — 2011.01 ~ 2011.02 (용역 계약으로 소스코드 공개불가)

     

    2. 프로젝트 소개

    . 개요

    · OpenCV의 C# 라이브러리인 Emgu CV를 이용

    · 사진에서 얼굴 부분 및 눈을 나타내는 포인트 추출

    · 사용자가 자신의 사진에 맞게 눈 영역을 선택

    · 안경 및 선글라스를 그리기 위한 포인트 설정

    · 상품(렌즈, 안경, 그리고 선글라스)을 그림

    . Intro

    · 프로그램 시작 화면

    · 이전에 상품 이미지를 합성한 과거 꾸미기 내역을 확인할 수 있는 화면

    · 상단의 체험하기 버튼을 눌러 다음단계로 이동

    image
    초기화면

    . Step1

    · 사진 올리기 화면

    · 목록에서 찾기 버튼을 통해 이전에 사용했던 사진을 바로 적용할 수 있음

    · 사진을 올리면 얼굴 부분만 추출

    image
    기존 사진

    image 사진이 올라간 화면

    image
    도움말 버튼 클릭 시

    image
    목록에서 찾기 버튼 클릭 시

     

    . Step2

    · 왼쪽 눈 포인트 수정

    image image

    · 오른쪽 눈 포인트 수정

    image image

    · 미간 및 관자놀이 포인트 수정

    image image

     

    . Step3

    · 액세서리 도구를 선택하면 해당 제품들이 나옴

    · 해당 제품들을 선택해 기존 이미지에 합성

    (안경과 선글라스는 90%, 렌즈는 20%의 투명도를 가짐)

    · 저장버튼을 누르면 현재 거울 속의 이미지를 파일로 저장

    image
    Step3 초기화면

     

    image image image

    안경 이미지 합성 결과화면