Image Binarization, Thresholding (영상 이진화, 임계값) - 2

MFC 프로젝트 내에서 OpenCV 라이브러리를 이용해서 이미지를 불러와서 창을 띄우는 법에 대해서 정리한다.


5. MFC 프로젝트 생성하기

1) File -> New -> Project -> MFC Application -> 프로젝트명(OpenCV) 입력 후 OK -> Next

2) Dialog Based 선택 후 Finish

3) 다이얼로그에 Button 생성 후 더블 클릭 (버튼 클릭 이벤트 함수)

4) 버튼 클릭 이벤트 함수 내에 파일 다이얼로그 추가하여 이미지 파일 경로 불러오기


6. OpenCV 라이브러리 함수로 이미지 출력하기

1) 소스 코드

2) 실행 결과




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(OpenCV 설정) http://poorman.tistory.com/category/OpenCV/Install

(Load and Display an Image) http://docs.opencv.org/3.0-beta/doc/tutorials/introduction/display_image/display_image.html


1. stdafx.h 헤더 파일에 
#include <atlimage.h>
추가



슬라이더 컨트롤(Slider Control)과 에디트 박스(Edit Box) 연동하기

1. 슬라이더 컨트롤의 마우스 휠과 클릭 시에 슬라이더 컨트롤 위치 값을 에디트 박스에 표시

2. 에디트 박스에 값 입력 시에 슬라이더 컨트롤 위치 표시

3. 에디트 박스 값 입력 시에 연속으로 숫자 입력 가능하도록 패치


<소스코드>

[에러 메세지]

Error LNK1104 cannot open file 'kernel32.lib'


[해결 방안]

1. C:\Program Files에서 kernel32.lib 파일 검색 -> 파일 위치 확인

 -> C:\Program Files\Windows Kits\8.1\Lib\winv6.3\um\x86


2.

[32비트 윈도우]

프로젝트 속성 -> VC++ 디렉터리 -> 라이브러리 디렉터리 -> C:\Program Files\Windows Kits\8.1\Lib\winv6.3\um\x86 추가


[64비트 윈도우]

프로젝트 속성 -> VC++ 디렉터리 -> 라이브러리 디렉터리 -> C:\Program Files\Windows Kits\8.1\Lib\winv6.3\um\x64 추가


[에러 메세지]

Error RC1015 cannot open include file 'winres.h'


[해결 방안]

개발툴과 Windows SDK의 버전 별 설치가 달라서 VC++ 디렉터리의 path가 잘못되어 있어서 생기는 에러로 V++ 포함 디렉터리를 수정한다.

1. 먼저 winres.h의 파일 위치를 확인한다.

 C:\Program Files에서 winres.h 파일 검색 -> 파일 위치 확인

-> C:\Program Files\Windows Kits\8.1\Include\um

2. 프로젝트 속성 -> VC++ 디렉터리 -> 포함 디렉터리 -> C:\Program Files\Windows Kits\8.1\Include\um 추가

[에러 메세지]

Error MSB6006 "rc.exe" exited with code 5


[해결 방안]

프로젝트 속성 -> VC++ 디렉터리 -> 실행 가능한 디렉터리 -> C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin 추가


[참고]

포함 라이브러리에 C:\Program Files\Microsoft SDKs\Windows\v7.0A\lib 추가 시에 에러 나옴



[에러 메세지]

Error C1083 Cannot open include file: 'SDKDDKVer.h': No such file or directory


[해결 방안]

개발툴과 Windows SDK의 버전 별 설치가 달라서 VC++ 디렉터리의 path가 잘못되어 있어서 생기는 에러로 V++ 포함 디렉터리를 수정한다.

1. 먼저 SDKDDKVer.h의 파일 위치를 확인한다.

 C:\Program Files\Microsoft SDKs\Windows 에서 SDKDDKVer.h 파일 검색 -> 파일 위치 확인

-> C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include

2. 프로젝트 속성 -> VC++ 디렉터리 -> 포함 디렉터리 -> C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include 추가

[ 에러 메세지 ]

#error: MFC does not support WINVER less than 0x0501. Please change the definition of WINVER in your project properties or precompiled header. 


[ 해결 방안 ]

StdAfx.h 파일의 WINVER 정의 값을 수정한다.

#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.

#define WINVER 0x0500 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.

#define WINVER 0x0601

#endif


[ WINVER 값 참고 ]

 Windows 운영체제

 WINVER 값

  Windows XP

0x501

Windows Vista

0x600

  Windows 7

0x601

  Windows 10

 0xA00 


Image Binarization, Thresholding (영상 이진화, 임계값) - 1

영상 이진화에 관한 기본 지식과 배경에 대해 정리한다.


1. 영상 이진화란?

 영상 이진화는 한 픽셀당 8비트 기준으로 0~255 값을 갖는 이미지를 주어진 임계값을 기준으로 임계값 이하는 0, 초과는 1로 변환해주는 작업이다 (실질적으로 값은 0과 255로 주어진다).


2. 왜 영상 이진화를 하는가?

 영상 이진화를 하는 이유는 영상 처리와 인식의 계산을 빠르게 하기 위함이다. 24비트의 RGB888 영상의 경우 한 픽셀당 24비트 값을 갖는데 이는 0~16777216(대략 1600만)의 범위인데 영상 이진화를 하면 1600만의 경우의 수를 2의 경우 수로 바꾸어주니 픽셀당 800만배 빠른 분석이 가능하다. 보통 1280 * 720인 HD화질의 1초에 10프레임인 영상을 분석한다고 하면 1초당 필요한 계산의 수가 현저히 줄어든다.

RGB888 원본   : 1280 * 720 * 10 * 16777216 

RGB888 이진화 : 1280 * 720 * 10 * 2


3. RGB 이미지를 이진화 하는 방법은?

 RGB 이미지를 이진화 하는 방법은 먼저 RGB의 평균 값을 픽셀당 0~255 값인 흑백 이미지로 전환한 후, 임계값을 기준으로 픽셀 값을 0과 255로 변환한다.

 예를 들어 한 픽셀당 24비트인 RGB888의 경우 흑백 이미지의 픽셀 값은 X = (Xr + Xg + Xb)/3 과 같이 계산한 후, 임계값 100을 기준으로 100보다 작거나 같은 값은 0, 100보다 큰 값은 255로 전환한다.


4. 실제 RGB 이미지를 이진화 한다면?

 영상 인식에서 hello world와 같은 Lenna양의 이미지를 예제로 사용했다.

 이 유명한 Lenna양의 이미지에 관해 이야기 하자면 남자들은 잘 아는 플레이보이 잡지에 실린 사진의 한 부분이다. 실제 전체 이미지는 19금이다(Reference 사이트 참고). 1973년 USC전자공학과 조교수였던 Alexander Sawchuk가 동료의 컨퍼런스 발표자료로 식상하지 않고 다채로운 색상을 보여주는 사람의 얼굴 이미지를 찾고 있었는데 마침 플레이보이지 최근호의 Lenna이미지를 발견했다고 한다. 그 당시 사용하던 스캐너가 100dpi의 고정해상도를 가졌고 512x512 크기의 이미지를 원해서 만들어진 이미지가 바로 지금 전설의 Lenna이미지였다. 1996년 1월 IEEE Transactions on Image Processing의 편집장이던 David C.Muson은 레나 사진을 영상 처리에 널리 사용하는 이유에 대해 다음과 같이 밝혔다고 한다.

먼저, 레나 이미지는 세밀함과 평면, 그림자, 그리고 질감이 적절하게 조화되어 있어서 다양한 이미지 처리 알고리즘을 처리하는 데 좋다. 이 이미지는 정말 좋은 시험용 이미지이다. 둘째로, 레나 이미지는 매력적인 여성의 사진이다. 그러므로 이미지 처리 연구 분야 종사자들이 매력적이라고 느끼는 이미지에 끌리는 것은 대다수가 남자이기 때문에, 별로 놀라울 게 없다.

 사진의 실제 주인공인 레나 쇠데르베리는 1997년 50회 the Society for Imaging Science in Technology학회에 게스트로 초대받았다.


 다음은 비주얼 스튜디오에서 OpenCV 라이브러리를 이용해서 RGB 이미지를 Gray 이미지, Binary 이미지로 변환하는 방법에 대해서 정리하겠다.




컴퓨터 비전과 영상 처리에 대해서 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(OpenCV C++ Thresholding) http://docs.opencv.org/3.2.0/db/d8e/tutorial_threshold.html

(OpenCV Python Thresholding) http://docs.opencv.org/3.2.0/d7/d4d/tutorial_py_thresholding.16777216

(다크 프로그래머 - 영상이진화) http://darkpgmr.tistory.com/115

(Lenna image) http://www.cs.cmu.edu/~chuck/lennapg/lenna.shtml

(Lenna Wiki) https://ko.wikipedia.org/wiki/%EB%A0%88%EB%82%98

+ Recent posts