러닝! OpenCV 3

OpenCV 라이브러리 창시자가 알려주는 컴퓨터 비전 완벽 가이드


  • 아드리안 캘러, 개리 브래드스키 지음
  • 장길호, 정태석, 신재익, 정은식, 전향란, 윤훈남 옮김

  • 데이터 사이언스 시리즈_014
  • ISBN: 9791158390969
  • 58,000원 | 2018년 04월 19일 발행 | 1040쪽



빠르게 팽창하고 있는 컴퓨터 비전 기술 분야를 이 실용서로 시작하라. 오픈 소스 OpenCV 라이브러리 창시자인 아드리안 캘러(Adrian Kaehler)와 개리 브래드스키(Gary Bradski)가 쓴 이 책은 개발자와 재미로 읽는 독자를 위한 완벽한 소개서다. 이 책을 통해 컴퓨터가 데이터를 ‘보고’ 결정을 내리는 응용 프로그램을 작성하기 위해 알아야 할 방법을 배울 것이다.

OpenCV는 보안, 의료 이미징, 패턴 및 얼굴 인식, 로봇 공학 그리고 공장 제품 검사와 같은 다양한 상업용 응용 프로그램에 사용하는 500개 이상의 함수를 제공한다. 이 책은 컴퓨터 비전과 OpenCV의 확실한 기초 지식을 제공하고 간단하거나 정교한 비전 응용 프로그램을 작성할 수 있게 해준다. 각 장의 실전 연습 문제를 통해 배운 내용을 적용해 볼 수 있다.

이 책은 컴퓨터 비전을 위한 머신러닝 도구를 포함해 최신 C++로 구현한 OpenCV 라이브러리 전체를 다룬다.

★ 이 책에서 다루는 내용 ★

  • OpenCV 데이터 타입과 배열 타입, 배열 연산 학습
  • HighGUI를 이용한 정지/동영상 이미지 캡처와 저장
  • 늘이기, 줄이기, 워핑, 재매핑 및 복구를 위한 이미지 변환
  • 얼굴 탐지를 포함한 패턴 인식 탐구
  • 시각 필드를 통한 객체와 모션 추적
  • 스테레오 비전으로 3D 이미지 재구성
  • OpenCV의 기본/고급 머신러닝 기술

아드리안 캘러 (Adrian Kaehler)

아드리안 캘러 박사는 사업가이자 실리콘 밸리 딥 러닝 그룹의 설립자다. 그의 연구 작업은 머신러닝, 통계 모델링, 컴퓨터 비전 및 로봇 공학 관련 주제를 포함한다. 그는 스탠퍼드 대학 인공지능 연구소에서 일했고 DARPA 그랜드 챌린지에서 우승한 스탠리 경주팀의 멤버였다.

개리 브래드스키 (Gary Bradski)

개리 브래드스키 박사는 어레이(Arraiy.com)의 CTO로 과거 여러 스타트업 기업에서 직책을 맡았고 스탠퍼드 대학 인공지능 연구소의 컴퓨터 과학과 컨설팅 교수로 재직했다. 그는 OpenCV 라이브러리의 창시자이자 유명 발표자이며 오픈 소스 공동체의 기여자다.

장길호 ([email protected])

정보통신학을 전공했고 DjVu 이미지와 PDF 기반의 전자 문서 솔루션 관련 프로젝트를 해왔다. 최신 C++ 표준 기술과 메타프로그래밍을 통한 표현력 있는 코드의 작성에 관심이 많다.

정태석 ([email protected])

명지대학교 공과대학에서 컴퓨터공학을 전공했다. 영상 보안 전문기업 아이디스에서 S/W 개발을 담당했고 IT 스타트업 “BUILDLIM”을 운영하기도 했다. 현재 안광학의료기기 업체인 HUVITZ에서 안광학S/W 연구원으로 의료영상저장 표준인 DICOM 관련 개발을 담당하고 있다.

신재익 ([email protected])

초등학교 때 GW-Basic과 MS-DOS로 컴퓨터에 입문하고 연세대 대학원에서 C++와 리눅스로 입자물리학을 공부했다. 졸업 후 국립암센터와 한국원자력의학원에서 DICOM 의료 영상과 방사선치료에 대한 GEANT4 몬테카를로 시뮬레이션을 연구했다.

정은식 ([email protected])

한국산업기술대학교 컴퓨터공학과에 진학하며 컴퓨터 프로그래밍을 시작했다. C++, 머신러닝, 영상처리, 서버, 최적화 분야에 관심이 많다.

전향란, 윤훈남 ([email protected])

cdism.com 소속으로 facebook.com/groups/OpenCPP “C++, OpenSource Study”를 운영하고 있다. 무엇보다 C++ 최신 스펙과 C++의 표현력을 발전시키는 데 관심이 많다. C++ 기반의 오픈 소스 프로젝트를 기획하고 진행한다.

  • ▣ 01장: 개요
    • OpenCV란?
    • OpenCV는 누가 사용하는가?
    • 컴퓨터 비전이란?
    • OpenCV의 기원
      • OpenCV 블록 다이어그램
      • IPP를 이용한 OpenCV의 성능 향상
      • 누가 OpenCV를 소유하는가?
    • OpenCV 다운로드 및 설치
      • 설치
    • Git으로 최신 OpenCV 얻기
    • OpenCV에 대한 더 많은 문서
      • 제공되는 문서
      • 온라인 문서와 위키
    • OpenCV Contribution 저장소
      • Contributed 모듈 다운로드하고 빌드하기
    • 이식성
    • 요약
    • 연습 문제
    •  
  • ▣ 02장: OpenCV 소개
    • Include 파일
      • 관련 자료
    • 첫 번째 프로그램 - 이미지 출력
    • 두 번째 프로그램 - 비디오
    • 재생 위치 이동하기
      • 간단한 변환
    • 별로 단순하지 않은 변환
    • 카메라 입력
    • AVI 파일에 쓰기
    • 요약
    • 연습 문제
    •  
  • ▣ 03장: OpenCV 데이터 타입 알아보기
    • 기본 사항
    • OpenCV 데이터 타입
      • 기본 데이터 타입의 개요
      • 기본 데이터 타입: 세부사항 알아보기
      • 도우미 객체
      • 유틸리티 함수
      • 템플릿 구조
    • 요약
    • 연습 문제
    •  
  • ▣ 04장: 이미지 및 대형 배열 타입
    • 동적 및 가변 저장장치
      • cv::Mat 클래스: N차원의 밀집 배열
      • 배열 만들기
      • 배열의 개별 요소 접근하기
      • 다차원 배열 반복자: NAryMatIterator
      • 블록 단위로 배열 요소 접근
      • 행렬 표현식: 대수학과 cv::Mat
      • 포화 캐스팅
      • 배열로 할 수 있는 더 많은 것
      • cv::SparseMat 클래스: 희소 배열
      • 희소 배열의 요소에 접근하기
      • 희소 배열에 있는 고유한 함수들
      • 대형 배열 타입의 템플릿 구조
    • 요약
    • 연습 문제
    •  
  • ▣ 05장: 배열 연산
    • 배열 타입으로 할 수 있는 더 많은 일
      • cv::abs()
      • cv::absdiff()
      • cv::add()
      • cv::addWeighted()
      • cv::bitwise_and()
      • cv::bitwise_not()
      • cv::bitwise_or()
      • cv::bitwise_xor()
      • cv::calcCovarMatrix()
      • cv::cartToPolar()
      • cv::checkRange()
      • cv::compare()
      • cv::completeSymm()
      • cv::convertScaleAbs()
      • cv::countNonZero()
      • cv::cvarrToMat()
      • cv::dct()
      • cv::dft()
      • cv::cvtColor()
      • cv::determinant()
      • cv::divide()
      • cv::eigen()
      • cv::exp()
      • cv::extractImageCOI()
      • cv::flip()
      • cv::gemm()
      • cv::getConvertElem()과 cv::getConvertScaleElem()
      • cv::idct()
      • cv::idft()
      • cv::inRange()
      • cv::insertImageCOI()
      • cv::invert()
      • cv::log()
      • cv::LUT()
      • cv::magnitude()
      • cv::Mahalanobis()
      • cv::max()
      • cv::mean()
      • cv::meanStdDev()
      • cv::merge()
      • cv::min()
      • cv::minMaxIdx()
      • cv::minMaxLoc()
      • cv::mixChannels()
      • cv::mulSpectrums()
      • cv::multiply()
      • cv::mulTransposed()
      • cv::norm()
      • cv::normalize()
      • cv::perspectiveTransform()
      • cv::phase()
      • cv::polarToCart()
      • cv::pow()
      • cv::randu()
      • cv::randn()
      • cv::randShuffle()
      • cv::reduce()
      • cv::repeat()
      • cv::scaleAdd()
      • cv::setIdentity()
      • cv::solve()
      • cv::solveCubic()
      • cv::solvePoly()
      • cv::sort()
      • cv::sortIdx()
      • cv::split()
      • cv::sqrt()
      • cv::subtract()
      • cv::sum()
      • cv::trace()
      • cv::transform()
      • cv::transpose()
    • 요약
    • 연습 문제
    •  
  • ▣ 06장: 그리기와 주석 달기
    • 도형 그리기
      • 라인 아트와 채워진 다각형
      • 폰트와 텍스트
    • 요약
    • 연습 문제
    •  
  • ▣ 07장: OpenCV 펑터
    • 작업 처리 객체
      • 주성분 분석(cv::PCA)
      • 특이값 분해(cv::SVD)
      • 난수 생성기(cv::RNG)
    • 요약
    • 연습 문제
    •  
  • ▣ 08장: 이미지, 비디오, 데이터 파일
    • HighGUI: 포터블 그래픽 툴킷
      • 이미지 파일 다루기
      • 이미지 로딩과 저장
      • 코덱에 대한 참고 사항
      • 압축과 압축 해제
    • 비디오 다루기
      • cv::VideoCapture 객체로 비디오 읽기
      • cv::VideoWriter 객체로 비디오 쓰기
    • 데이터 지속성
      • cv::FileStorage에 쓰기
      • cv::FileStorage에서 읽기
      • cv::FileNode
    • 요약
    • 연습 문제
    •  
  • ▣ 09장: 크로스 플랫폼과 기본 윈도우
    • 윈도우 작업
      • HighGUI 기본 그래픽 유저 인터페이스
      • Qt 백엔드로 작업하기
      • 전체 GUI 툴킷과 OpenCV 통합
    • 요약
    • 연습 문제
    •  
  • ▣ 10장: 필터와 컨벌루션
    • 개요
    • 시작하기 전에
      • 필터, 커널, 컨벌루션
      • 테두리 외삽법과 바운더리 조건
    • 경계값 연산
      • 오츠(Otsu)의 알고리즘
      • 적응형 경계값
    • 스무딩
      • 단순 블러 및 박스 필터
      • 메디안 필터
      • 가우시안 필터
      • 바이레터럴 필터
    • 미분 및 그래디언트
      • 소벨 미분
      • 샤르(Scharr) 필터
      • 라플라시안
    • 이미지 모폴로지
      • 팽창과 침식
      • 일반 모폴로지 함수
      • 열림과 닫힘 연산
      • 탑햇과 블랙햇 연산
      • 자신만의 커널 만들기
    • 임의의 선형 필터를 사용한 컨벌루션
      • cv::filter2D()로 일반적인 필터 만들기
      • cv::sepFilter2D를 사용해 분리 가능한 일반 필터 만들기
    • 커널 빌더
    • 요약
    • 연습 문제
    •  
  • ▣ 11장: 일반 이미지 변환
    • 개요
    • 늘이기, 줄이기, 왜곡하기, 회전하기
      • 균일 크기 조절
      • 이미지 피라미드
      • 비균일 매핑
      • 아핀 변환
      • 원근 변환
    • 일반적인 재매핑
      • 극좌표 매핑
      • 로그 극좌표(LogPolar)
      • 임의의 매핑
    • 이미지 복구
      • 인페인팅
      • 노이즈 제거
    • 히스토그램 평활화
      • cv::equalizeHist(): 콘트라스트 평활화
    • 요약
    • 연습 문제
    •  
  • ▣ 12장: 이미지 분석
    • 개요
    • 이산 푸리에 변환
      • cv::dft(): 이산 푸리에 변환
      • cv::idft(): 역 이산 푸리에 변환
      • cv::mulSpectrums(): 스펙트럼 곱셈
      • 이산 푸리에 변환을 이용한 컨벌루션
      • cv::dct(): 이산 코사인 변환
      • cv::idct(): 역 이산 코사인 변환
    • 적분 이미지
      • 표준 합산 적분을 위한 cv::integral()
      • 제곱 합산 적분을 위한 cv::integral()
      • 기울어진 합산 적분을 위한 cv::integral()
    • 캐니 엣지 검출기
    • cv::Canny()
    • 허프 변환
      • 허프 선 변환
      • 허프 원 변환
    • 거리 변환
      • cv::distanceTransform(): 라벨이 없는 거리 변환
      • cv::distanceTransform(): 라벨이 붙는 거리 변환
    • 세그멘테이션
      • 색 채움(Flood Fill)
      • 그랩컷
      • 평균 이동 세그멘테이션
    • 요약
    • 연습 문제
    •  
  • ▣ 13장: 히스토그램과 템플릿
    • OpenCV의 히스토그램 데이터 표현
      • cv::calcHist(): 데이터에서 히스토그램 만들기
    • 히스토그램을 이용한 기본 조작
      • 히스토그램 정규화
      • 히스토그램 경계값
      • 가장 인기 있는 빈 찾기
      • 두 히스토그램 비교하기
    • 더 복잡한 히스토그램 메서드
      • 불도저 거리
    • 역투영
    • 템플릿 매칭
      • 제곱 차이 매칭 메서드(cv::TM_SQDIFF)
    • 요약
    • 연습 문제
    •  
  • ▣ 14장: 윤곽선
    • 윤곽선 찾기
      • 윤곽선 계층 구조
      • 윤곽선 그리기
      • 윤곽선 예제
      • 다른 윤곽선 예제
      • 신속한 연결된 구성 요소 분석
    • 윤곽선을 이용한 더 많은 작업
      • 다각형 근사법
      • 기하학 및 요약 특성
      • 기하학적 테스트
    • 윤곽선과 이미지 매칭
      • 모멘트
      • 모멘트에 대한 추가 정보
      • Hu 모멘트와 매칭
      • 형상 컨텍스트를 사용해 형상 비교하기
    • 요약
    • 연습 문제
    •  
  • ▣ 15장: 배경 분리
    • 배경 분리의 개요
    • 배경 분리의 약점
    • 장면 모델링
      • 픽셀의 슬라이스
      • 프레임 간 차이
    • 평균화된 배경 메서드
      • 누적된 평균, 분산, 공분산
    • 더 진보된 배경 분리 메서드
      • 구조체 만들기
      • 배경 러닝하기
      • 움직이는 전경 객체에서 러닝하기
      • 배경 차분으로 전경 객체 찾기
      • 코드북 배경 모델 사용하기
      • 코드북 모델에 대한 몇 가지 생각
    • 배경을 정리하는 연결된 구성 요소
      • 빠른 테스트
    • 두 배경 메서드 비교하기
    • OpenCV에서 배경 분리 구현
      • cv::BackgroundSubtractor 기반 클래스
      • KB 메서드
      • 지브코비치 메서드
      • cv::BackgroundSubtractorMOG2 클래스
    • 요약
    • 연습 문제
    •  
  • ▣ 16장: 키포인트와 기술자
    • 키포인트와 트래킹의 기초
      • 코너 찾기
      • 옵티컬 플로우 소개
      • 희소 옵티컬 플로우를 위한 루카스-카나데 메서드
    • 일반화된 키포인트와 기술자
      • 옵티컬 플로우, 트래킹, 인식
      • OpenCV가 키포인트와 기술자를 제어하는 일반적인 방법
      • 핵심 키포인트 검출 메서드
      • 해리스-시-토마시(Harris-Shi-Toma
      • 피처 검출기와 cv::GFTTDetector
      • 키포인트 필터링
      • 매칭 메서드
      • 결과 표시하기
    • 요약
    • 연습 문제
    •  
  • ▣ 17장: 트래킹
    • 트래킹 개념
    • 밀집 옵티컬 플로우
      • 파네백 다항식 확장 알고리즘
      • 듀얼 TV-L1 알고리즘
      • 단순 플로우 알고리즘
    • 평균 이동과 캠시프트 트래킹
      • 평균 이동
      • 캠시프트
    • 모션 템플릿
    • 추정기
      • 칼만 필터
      • 확장 칼만 필터에 대한 간략한 설명
    • 요약
    • 연습 문제
    •  
  • ▣ 18장: 카메라 모델과 캘리브레이션
    • 카메라 모델
      • 투영 기하학의 기초
      • 로드리게스 변환
      • 렌즈에 의한 왜곡
    • 캘리브레이션(Calibration)
      • 회전 행렬과 평행 이동 벡터
      • 캘리브레이션용 보드
      • 호모그래피
      • 카메라 캘리브레이션
    • 왜곡 제거
      • 왜곡 제거 지도
      • cv::convertMaps()를 사용해 왜곡 제거 지도의 표현 변환하기
      • cv::initUndistortRectifyMap()을 사용해 왜곡 제거 지도 계산하기
      • cv::remap()을 사용한 이미지의 왜곡 제거
      • cv::undistort()를 사용한 왜곡 제거
      • cv::undistortPoints()를 사용한 희소 왜곡 제거
    • 모두 한꺼번에 캘리브레이션하기
    • 요약
    • 연습 문제
    •  
  • ▣ 19장: 투영과 3차원 비전
    • 투영
    • 아핀과 원근 변환
      • 조감도 변환 예제
    • 3차원 자세 추정
      • 단일 카메라를 이용한 자세 추정
    • 스테레오 이미징
      • 삼각 측량
      • 에피폴라 기하 구조
      • 필수 및 기본 행렬
      • 에피폴라 선 계산하기
      • 스테레오 캘리브레이션
      • 스테레오 정류
      • 스테레오 대응
      • 스테레오 캘리브레이션, 정류, 대응 코드 예제
      • 3차원 재투영을 통한 깊이 맵
    • 모션 구조
    • 2차원 및 3차원 라인 피팅
    • 요약
    • 연습 문제
    •  
  • ▣ 20장: OpenCV에서의 머신러닝 기본
    • 머신러닝이란?
      • 훈련 집합과 테스트 집합
      • 지도 러닝과 비지도 러닝
      • 생성 모델과 판별 모델
      • OpenCV의 ML 알고리즘
      • 비전에서 머신러닝 사용하기
      • 변수 중요성
      • 머신러닝 문제 진단하기
    • ML 라이브러리의 레거시 루틴
      • K-평균
      • 마할라노비스 거리
    • 요약
    • 연습 문제
    •  
  • ▣ 21장: StatModel: 머신러닝을 위한 OpenCV 표준 모델
    • ML 라이브러리의 일반 루틴
      • 훈련과 cv::ml::TrainData 구조체
      • 예측
    • cv::StatModel을 사용한 머신러닝 알고리즘
      • 단순/일반 베이즈 분류기
      • 바이너리 의사 결정 트리
      • 부스팅
      • 랜덤 트리
      • 기댓값 최대화
      • K-최근접 이웃(KNN)
      • 다층 퍼셉트론(MLP)
      • SVM(서포트 벡터 머신)
    • 요약
    • 연습 문제
    •  
  • ▣ 22장: 객체 검출
    • 트리 기반 객체 검출 기법
      • 캐스케이드 분류기
      • 지도 학습 및 부스팅 이론
      • 새로운 객체 훈련
    • 서포트 벡터 머신을 이용한 객체 검출
      • 객체 검출을 위한 Latent SVM
      • Bag of Words 알고리즘과 의미에 의한 분류
    • 요약
    • 연습 문제
    •  
  • ▣ 23장: OpenCV의 미래
    • 과거와 현재
      • OpenCV 3.x 버전
    • 이전에 예측한 내용이 얼마나 맞을까?
    • OpenCV의 미래
      • 현재 GSoC(Google Summer of Code) 작업
      • 커뮤니티 기여
      • OpenCV.org
    • 인공 지능에 대한 일부 억측
    • 책을 마치며
    •  
  • ▣ 부록A: 평면 분할
    • 들로네 삼각 분할, 보로노이 터셀레이션
      • 들로네 또는 보로노이 재분할
      • 들로네 재분할 탐색하기
      • 사용 예제
    • 연습 문제
    •  
  • ▣ 부록B: opencv_contrib
    • opencv_contrib 모듈의 개요
      • opencv_contrib의 내용
    •  
  • ▣ 부록C: 캘리브레이션 패턴 - OpenCV가 사용하는 캘리브레이션 패턴
  • 663쪽 본문 중간의 다음 수식

    $ x_{screen} = f_x \cdot {\frac{X} {Z}} C_x $

    ==>

    $ x_{screen} = f_x \cdot {\frac{X} {Z}} + C_x $

  • 663쪽 본문 중간의 다음 수식

    $ y_{screen} = f_y \cdot \frac {X} {Z} C_y $

    ==>

    $ y_{screen} = f_y \cdot \frac {X} {Z} + C_y $