* 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가 사용하는 캘리브레이션 패턴