이 책은 컴퓨터 비전 기초 이론을 비롯해 OpenCV에서 가장 많이 활용되는 기능들을 설명하고 이미지 데이터에서 유의미한 정보를 찾는 방식을 다룹니다. 또한 C#과 파이썬이라는 두 가지 프로그래밍 언어로 구성돼 있어 C#이나 파이썬 개발자분들이 손쉽게 OpenCV에 대해 배울 수 있는 영상처리 입문서입니다.
이 책에서는 OpenCV를 폭넓게 활용할 수 있도록 Tesseract-OCR과 TensorFlow 등을 활용해 영상 처리 프로젝트까지 진행하고, 다양한 응용 방법을 제시합니다.
★ 이 책에서 다루는 내용 ★
- C#과 파이썬용 OpenCV의 데이터 형식과 행렬 및 배열 연산
- 이미지/동영상/카메라를 활용한 입출력과 결과 저장
- 전처리 과정과 정보를 탐색하기 위한 이미지 변형
- 유의미한 정보를 검출하기 위한 이미지 변환
- 이미지에서 정보를 검출 및 인식
- 객체 검출을 포함한 모션 추적
- Tesseract-OCR과 C# OpenCvSharp4를 활용한 프로젝트
- TensorFlow와 Python OpenCV4를 활용한 프로젝트
도서 상세 이미지
윤대희
서울과학기술대학교 기계시스템디자인공학을 전공했다. 컴퓨터 비전 강의를 진행했으며, 블로그(https://076923.github.io/)를 통해 프로그래밍 및 컴퓨터 비전 지식을 공유하고 있다. 현재는 3D 공간데이터 플랫폼 회사인 어반베이스의 머신러닝 팀에서 컴퓨터 비전을 담당하며, 2D 도면을 3D로 변환하는 프로젝트를 진행하고 있다. 컴퓨터 비전, 머신러닝, 딥러닝을 연구하고 활용하는 데 관심이 있다.
- [01부] OpenCV 이론
- ▣ 01장: 컴퓨터 비전의 이해
- 01 컴퓨터 비전이란?
- 영상 처리의 필요성
- 영상 처리의 한계점
- 데이터 변형
- 이미지 데이터
- 02 OpenCV란?
- OpenCV의 역사
- 03 알고리즘 설계
- 문제 해결을 위한 선행 조건
- 하드웨어와 소프트웨어의 선택
- 시스템 설계
- 개발 규칙
- 04 디지털 이미지 프로세싱
- 전처리 알고리즘
- 노이즈 및 디노이즈
- 특징 및 유사성 검출
- 05 영상 처리 분야
- 영화 산업
- 의료 분야
- 이미지 번역
- OpenCV의 활용
- 06 C# OpenCvSharp 설치
- NuGet 패키지 설치
- 네이티브 래퍼(Native Wrapper) 적용
- 확장 네임스페이스
- OpenCvSharp 사용하기
- 참고사항
- 07 Python OpenCV 설치
- pip를 이용한 설치
- IDE
- OpenCV 사용하기
- 참고사항
- 01 컴퓨터 비전이란?
- ▣ 02장: OpenCV 시작하기
- 01 이미지 크기
- 이미지 크기 속성
- OpenCV에서 이미지의 크기를 표현하는 방법
- 02 정밀도
- 비트 표현
- OpenCV 정밀도 표현법
- 03 채널
- 색상 표현
- OpenCV 채널 표현법
- 04 관심 영역
- 05 관심 채널
- 06 히스토그램
- 01 이미지 크기
- ▣ 03장: 데이터 타입과 연산
- 01 기본 데이터
- C# OpenCvSharp에서 사용되는 기본 데이터 타입
- 스칼라(Scalar) 구조체
- Python OpenCV에서 사용되는 기본 데이터 타입
- 02 Mat 데이터
- 조밀 행렬(dense matrix)
- Mat 클래스 – N차원 밀집 행렬
- Mat 클래스 메모리 레이아웃
- Mat 객체 생성
- MatExpr 클래스 – 행렬 표현식
- 행렬의 개별 단위 요소에 접근하기
- 행렬의 블록 단위 요소에 접근하기
- Mat 클래스 행렬 연산
- 그 밖의 행렬 메서드
- 희소 행렬
- 희소 행렬 생성
- 희소 행렬의 요소 할당 및 접근
- Mat 클래스 - 관심 영역
- Mat 클래스 - 관심 채널
- Numpy 행렬
- 03 Numpy 데이터
- ndarray 클래스 - N차원 배열
- 배열의 개별 단위 요소에 접근하기
- 배열의 블록 단위 요소에 접근하기
- 배열 차원 변형
- 배열 병합 및 분리
- 그 밖의 배열 함수
- 배열 연산
- matrix 클래스
- ndarray 클래스 - 관심 영역
- ndarray 클래스 - 관심 채널
- 01 기본 데이터
- [02부] C# & 파이썬 함수
- ▣ 04장: 기초 예제
- 01 이미지 입력
- 02 이미지 출력
- 03 동영상 출력
- FPS(Frame Per Second)
- 04 카메라 출력
- 05 도형 그리기
- 선형 타입
- 비트 시프트
- 직선 그리기
- 사각형 그리기
- 원 그리기
- 호 그리기
- 내부가 채워지지 않은 다각형 그리기
- 내부가 채워진 다각형 그리기
- 문자 그리기
- 06 결과 저장
- 이미지 저장
- 동영상 저장
- ▣ 05장: 이미지 변형
- 01 색상 공간 변환
- 02 HSV 색상 공간
- 03 이진화
- 오츠 알고리즘
- 삼각형 알고리즘
- 04 이미지 연산
- 덧셈 함수
- 뺄셈 함수
- 곱셈 함수
- 나눗셈 함수
- 최댓값 함수
- 최솟값 함수
- 절댓값 함수
- 절댓값 차이 함수
- 비교 함수
- 선형 방정식 시스템의 해 찾기 함수
- AND 연산 함수
- OR 연산 함수
- XOR 연산 함수
- NOT 연산 함수
- 05 흐림 효과
- 커널과 고정점
- 테두리 외삽법
- 단순 흐림 효과
- 박스 필터 흐림 효과
- 중간값 흐림 효과
- 가우시안 흐림 효과
- 양방향 필터 흐림 효과
- ▣ 06장: 이미지 변환
- 01 확대 & 축소
- 이미지 확대(Pyramid Up)
- 이미지 축소(Pyramid Down)
- 02 이미지 크기 조절
- 03 대칭 & 회전
- 04 기하학적 변환
- 아핀 변환
- 원근 변환
- 05 모폴로지 변환
- 06 모폴로지 연산
- 열림 연산
- 닫힘 연산
- 그레이디언트 연산
- 탑햇 연산
- 블랙햇 연산
- 히트미스 연산
- 01 확대 & 축소
- ▣ 07장: 이미지 검출
- 01 가장자리 검출
- 소벨 미분
- 샤르 필터
- 라플라시안
- 캐니 엣지
- 02 윤곽선 검출
- 계층 구조
- 윤곽선 검출
- 윤곽선 그리기
- 03 다각형 근사
- 윤곽선의 길이 계산
- 윤곽선의 면적 계산
- 윤곽선의 경계 사각형
- 윤곽선의 최소 면적 사각형
- 윤곽선의 최소 면적 원
- 윤곽선의 타원 피팅
- 윤곽선의 볼록 껍질
- 윤곽선의 볼록성 시험
- 윤곽선의 모멘트
- 04 코너 검출
- 05 직선 검출
- 06 원 검출
- [03부] 실전 예제
- 01 가장자리 검출
- ▣ 08장: C# - 명함 검출
- 01 테서렉트
- 02 각도 계산
- 03 사각형 검출
- 04 이미지 변환
- 05 문자 인식
- ▣ 09장: 파이썬 - 객체 검출
- 01 텐서플로
- 02 객체 검출
- 03 정규 표현식
- 04 객체 추적
- 05 객체 인식
- ▣ 부록A: 색상 코드표
- 스칼라 구조체의 색상 코드표
- ▣ 부록B: 정규 표현식
- 메타 문자 목록
- 이스케이프 문자 목록
- 최소 매칭 목록
- 정규 표현식 함수 - 플래그
- Match 객체의 메서드 - Match 객체의 속성
- GitHub 저장소: https://github.com/wikibook/opencv4
- ZIP 형식으로 다운로드: https://github.com/wikibook/opencv4/archive/master.zip
51쪽, 페이지 상단 예제 코드의 밑에서 4번째 줄
dst = np.hstack([[image[:,:,0], result])
==>
dst = np.hstack([image[:,:,0], result])
93쪽, 본문 밑에서 5번째 줄
일치시키려면
표 1.2의
‘Python OpenCV 정밀도 형식’을 참고한다.==>
일치시키려면
표 2.2의
‘Python OpenCV 정밀도 형식’을 참고한다.95쪽, 예제 3.23의 5번째 줄
array3 = np.array(matrix1, copy=False)
==>
array3 = np.array(array1, copy=False)
95쪽, 본문 밑에서 5번째 줄
array4는 mat() 함수로
matrix 클래스를 ndarray 클래스로 사용하지 않고 하위 클래스로 사용한다.
==>
array4는 mat() 함수로
하위 클래스로서 ndarray 클래스가 아닌 matrix 클래스를 사용한다.
97쪽, 본문 6번째 줄
앞서 설명한
subok
매개변수처럼==>
앞서 설명한
copy
매개변수처럼99쪽, 본문 밑에서 4번째 줄
즉, array[0:-1:2]와 동일한
의미를
갖는다.==>
즉, array[0:-1:2]와 동일한
결과를
갖는다.106쪽, 본문 밑에서 2번째 줄
예제
3.33은
브로드캐스팅과==>
예제
3.32는
브로드캐스팅과106쪽, 예제 3.33의 번호를 예제 3.32로 수정
110쪽, 본문 밑에서 첫 번째 줄
예제
3.34는
matrix 클래스를 사용해==>
예제
3.33은
matrix 클래스를 사용해110쪽, 예제 3.34의 번호를 예제 3.33으로 수정
111쪽, 본문 밑에서 첫 번째 줄
예제
3.35는
관심 영역을==>
예제
3.34는
관심 영역을111쪽, 예제 3.35의 번호를 예제 3.34로 수정
112쪽, 본문 2번째 줄
end가
도착 지점이 아닌 너비와 높이를
의미한다는 것이다.==>
end가
너비 또는 높이가 아닌 도착 지점을
의미한다는 것이다.112쪽, 본문 밑에서 9번째 줄
예제
3.36은
관심 영역을==>
예제
3.35는
관심 영역을112쪽, 예제 3.36의 번호를 예제 3.35로 수정
190쪽, 본문 밑에서 첫 번째 줄
예제
5.8과 예제 5.9는
C# OpenCvSharp과==>
예제
5.9와 예제 5.10은
C# OpenCvSharp과190쪽, 예제 5.8의 번호를 예제 5.9로 수정
191쪽, 본문 첫 번째 줄
예제
5.8은
그레이스케일 이미지에==>
예제
5.9는
그레이스케일 이미지에191쪽, 예제 5.9의 번호를 예제 5.10으로 수정
192쪽, 본문 첫 번째 줄
예제
5.9는
그레이스케일 이미지에==>
예제
5.10은
그레이스케일 이미지에254쪽, 그림 6-14를 다음 그림으로 교체
274쪽, 본문 밑에서 4번째 줄
Roof Edge는
노이즈가 제거된 뒤의 노이즈가 제거된 뒤의
Line Edge다.==>
Roof Edge는
노이즈가 제거된 뒤의
Line Edge다.389쪽, 페이지 상단 예제의 아래 코드를 수정(예제 9.12)
flow = cv2.calcOpticalFlowFarneback(prev_gray, next_gray, flow=None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.1, flags= cv2.OPTFLOW_USE_INITIAL_FLOW)
==>
flow = cv2.calcOpticalFlowFarneback(prev_gray, next_gray, flow=None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.1, flags= cv2.OPTFLOW_FARNEBACK_GAUSSIAN)
392쪽, 예제 9.13의 첫 번째 줄
flow = cv2.calcOpticalFlowFarneback(prev_gray, next_gray, flow=None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.1, flags=cv2.OPTFLOW_USE_INITIAL_FLOW )
==>
flow = cv2.calcOpticalFlowFarneback(prev_gray, next_gray, flow=None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.1, flags=cv2.OPTFLOW_FARNEBACK_GAUSSIAN)