※ 요약

필자가 만든 Color Picker(색상 추출) 프로그램이다. 시중에 많은 컬러 피커 프로그램들이 있고, 잘 만들어진 것도 많지만 필자가 사용할때 꼭 한 두 가지 부족한 기능들로 인해 직접 만들게 되었다. 필자가 필요한 기능 위주로 만들어서 사용자 입장에서는 더 필요한 기능이 있을 수도 있을 수 있는데, 이런 부분들은 댓글로 요청하면 가능한 선에서 추가/수정하도록 하겠다. 이 프로그램은 주로 블로그를 하면서 rgb값과 html(hex)값을 확인하기 위해 만들었다.


이 프로그램은 C++11과 마우스 후킹과 키보드 후킹 기능을 이용해서 만들었다. 마우스 후킹은 마우스의 움직임을 전역적으로 확인하려고 사용했고, 키보드 후킹은 전역 단축키(Global Hotkey) 때문에 사용했다. 제작할때 가장 힘들고 오래걸린 작업은 화면 구성인데 화면 구성에 50% 이상의 시간을 사용한거 같다. 화면 구성은 jcpicker라는 프로그램을 참고했다.


※ 개발 환경

Windows 10 x64

Visual Studio 2015 Community Update1

Unicode


Modern C++


MFC 14.0

Ado( MariaDB ODBC ver 1.0.5 )

regex


실행 환경 테스트

Windows 7 x64

Windows 10 x64


※ 다운로드

OiColorPicker_0.9.zip



※ 사용 방법

프로그램 사용법은 어렵지 않아서 몇 번 실행해보면 바로 익숙해질 것이다.

아래는 OiColorPicker를 처음 실행한 모습이다. 후킹을 사용했기때문에 프로그램만 실행하고 마우스를 움직이면 마우스 위치의 컬러 코드 값을 출력해준다.


저장하고 싶은 컬러 코드가 있으면 Alt+X키를 누르면 아래 우측 화면과 같이 컬러코드가 저장된다. 마찬가지로 후킹을 사용하였기때문에 OiColorPicker프로그램이 다른 프로그램에 가려지거나 안보여도 Alt+X키를 누르면 우측 리스트에 저장된다. 저장될때는 컬러코드와 함께 해당 컬러코드 색으로 저장되기 때문에 다시 찾아쓰기 편하다. 다시 찾아쓸때는 리스트에서 해당 아이템을 선택 후 Ctrl+C키를 누르면 해당 Hex 컬러코드 값이 복사된다. 또 Delete키도 먹힌다.


마지막으로 Converter기능인데, 화면 좌하단에 위치해있다.

rgb->hex 또는 hex->rgb 컬로 코드로 바꿔준다.


※ 버전

2016.02.11.

ver 0.9 (MD5 : 402e0bed11198576cc7618aef0ea3359) OiColorPicker 테스트 버전


'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

ip 확인 프로그램 - 오뇽 IP  (2) 2013.12.20
각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
Point Cloud  (0) 2013.10.02
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01


※ 요약

간단하게 자신의 공인 ip와 사설 ip, MAC 주소를 알 수 있는 프로그램이다.


※ 개발 환경

Windows 7 x64

Visual Studio 2010 SP1

유니코드


언어

C++


라이브러리

MySQL


실행 환경 테스트

XP x86

7 x64


※ 다운로드

OignonIP 1.1.zip



※ 사용 방법

아래는 프로그램을 실행한 모습이다. IP 주소 외에도 호스트 이름, 내부IP 주소, MAC주소 등을 확인할 수 있다.


프로그램이 제공하는 방법 외에 다른 방법으로 공인 IP를 확인할 수 있도록 하여 정확도를 높였다.


네이버에서 확인하는 모습이다.


ipconfig.co.kr에서 확인하는 모습이다.


getwanip.com에서 확인하는 모습이다.




※ 버전

17.03.05 Ver 1.1

- 서버 변경

- 시작 속도 개선


13.12.20 Ver 1.0

- 프로그램 제작 배포



※ 요약

OpenGL 처음 배울 당시인 2011년도 쯤에 공부할겸 만든 프로그램이다.

프로그램 창이 투명하기 때문에 뒤에 있는 그림이나 사진의 각도를 간단하게 측정할 수 있다.

사용법은 마우스 좌, 우 클릭과 "i"키가 전부다.


※ 개발 환경

Windows 7 x64

Visual Studio 2010 SP1


C++


Win32 API

OpenGL


※ 다운로드

각도기.zip



※ 사용 방법

아래는 프로그램을 실행한 화면이다. 위에서도 말했지만 창이 투명하기 때문에 각도를 측정할 때 편하다.


마우스 좌클릭과 우클릭으로 각도를 측정할 수 있다. 또 i키를 누르면 화면에 표시되는 정보를 On/Off 할 수 있다.




※ 버전

-




도를 도분이나 도분초로 변환 가능하며 반대로 도분초를 도나 도분, 도분을 도분초나 도로 변환 가능한 프로그램 입니다. 위경도를 입력 후 이동버튼으로 해당 좌표에 해당하는 곳으로 이동도 가능하며 지도는 구글맵을 이용했습니다.


도, 도분, 도분초 각 에디트에 값을 입력하면 자동으로 다른 값으로 변경됩니다.






EXIF Viewer겸 HSV 공간 분포도 프로그램입니다.


- 개발 환경 및 사용 라이브러리

win8

vs 2010

OpenGL

OpenCV

FreeImage

MySQL

Google Map API

Daum Local API

실행 테스트는 XP x86, 7 x64, 8 x64에서 했습니다.


RGB나 YCbCr, YIQ, CMYK 등의 색상 모델은 대체로 시스템이나 하드웨어에서의 사용을 위해 만들어진 색상 모델이라면 HSV( Hue Saturation Value )는 인간의 색인지에 기반을 둔 사용자 지향성 색상모델입니다.


인간이 색을 인지하는 방식이 직관적이고 자연스럽기 때문에 HSV 컬러 모델은 시각 예술에 자주 쓰인다고 하네요. 일상에서도 자주 쓰이는데, 오렌지 색을 표현할 때 RGB성분으로 R=245, G=110, B=20으로 표현하는 것보다는, 색상(H)은 오렌지색이며 명도(V)는 밝고 채도(S)는 짙다고 표현하면 어떤 색인지 금방 떠올릴 수 있을 것입니다. 이처럼 인간이 색을 표현할 때 자주 사용하는 표현 방법이 HSV 표현과 비슷하다고 합니다.



- HSV 색 분포도

240 전후는 파랑, 60 전후는 노랑 등, 색마다 수치가 정해져 있습니다.

- RGB를 HSV로 바꾸는 공식


- 프로그램 외형


사진을 열어서 평면으로 출력중입니다. 히스토그램도 같이 출력됩니다.


HSV 중 색상(H) 분포도 입니다. 3D상에 수치는 나와있지 않지만 아래를 바닥을 0, 천장을 360으로 했을때 초록색이라 120 전후에 분포해 있습니다.


채도(S) 분포도입니다.


밝기(V) 분포도입니다. 어두운 부분은 아래로, 밝은 부분은 위로 향합니다.


흑백으로 출력한 화면입니다.



색상 영역을 잘 나타내는 그림 2장입니다. 색상에 따라 0부터 360 사이에서 분포합니다. 잘보면 색상 분포 순서가 무지개색입니다.



조건을 줘서 초록색만 출력해봅니다.


EXIF정보 입니다. 무슨 카메라에 어떤 렌즈로 찍었는지, 위치는 어디인지, 어떤 소프트웨어로 수정 했는지 등이 나옵니다. 물론 데이터가 있을때만 출력되고 Ctrl+C로 선택한 아이템이 클립보드로 복사도 됩니다.


요즘 스마트폰으로 찍은 사진이거나 DSLR에 GPS장비를 장착하면 위치정보가 기록되는데, 그 기록된 데이터를 바탕으로 아래 지도에 표시합니다. 지도는 다음 지도와 구글 지도 두 가지입니다.


사진에 위치 정보가 없을 경우 초기 위치인 경복궁이 나옵니다.


아래는 구글 맵을 선택한 화면입니다.


맵은 옵션에서 고를 수 있습니다.


EXIF정보가 있을 경우 HTML파일로도 출력이 가능합니다.

아래 정보를 보면

카메라는 Sony SLT-A99V 모델에

조리개는 F2.8

찍은 날짜는 13년 9월 18일

셔속은 1/5000

등을 알 수 있습니다.


'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

ip 확인 프로그램 - 오뇽 IP  (2) 2013.12.20
각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
Point Cloud  (0) 2013.10.02
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01
HSV Cam Viewer  (4) 2013.03.31



ply 파일을 읽어서 출력하는 프로그램입니다. ply 파일은 PhotoSynth에서 SynthExport프로그램을 통해 얻을 수 있습니다.


개발 환경은 아래와 같습니다.

Win x64

Visual Studio 2010 SP1

OpenGL




 




'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01
HSV Cam Viewer  (4) 2013.03.31
HSV Image Viewer  (1) 2013.03.31
 
OignonLotto 5.7.9.zip
다운로드
OignonLotto 5.8.0.zip
2.13MB

 

프로그램의 목적은 로또 1등을 위한 프로그램이 아니라

사용자가 로또할 때 조금 더 편하게 이용하라고 만든 프로그램입니다

 

예를 들면 내가 집이 필요해서 집을 지어야 하는데,

집을 지어 주는게 아니라 집을 편하게 짓는데 필요한 도구의 개념입니다.

 

참고로 저는 로또 거의 안하고, 사도 자동으로 삽니다 헤헤

 

 

프로그램 사용 방법 설명 링크

 

 

개발 환경

Windows 10 x64

Visual Studio 2010 SP1

유니코드

 

언어

C++

 

라이브러리

MFC

MySQL

MS Office

curl

rapidjson

 

실행 환경 테스트

XP x86

7 x64

8 x64

10 x64

 

인터넷 서핑하다 우연히 로또 프로그램 보고 재밌을거 같아 공부할겸 만든 로또 프로그램입니다. 로또 전 회차 당첨번호 조회 및 무작위 번호 생성, 조건 번호 생성, 간단한 통계 기능이 있습니다. 또한 프로그램 자체 통계도 있어서 자신 이외의 다른 사용자들이 자주 사용하는 기능이나 자주 사용하는 시간대, 자주 사용하는 요일 등을 알 수 있습니다. 문의 사항이나 궁금한 사항, 요구사항 등은 댓글로 남겨주세요.

 


 

 

 

 

 

 

 

 

#Version History

16.05.02. ver 5.7.6

-curl 라이브러리 추가

-rapidjson 라이브러리 추가

 

16.04.19. ver 5.7.0

-cafe24 가상 서버로 서버 변경

-안전성 대폭 향상

 

-전체적인 속도 향상(번호 생성시 최고 40%)

 

16.01.22. ver 5.6.2

-XP 지원

 

16.01.12. ver 5.6.1

-실행 속도 개선

 

16.01.11. ver 5.6.0

-채팅 기능 추가

-다음 버전을 위한 코드 추가

 

16.01.09. ver 5.5.3

-통계1탭 내 그래프 위치 변경

-각 통계1, 통계2, 통계3탭 헤더들에 코멘트 추가

-기타 최적화

 

16.01.07. ver 5.5.0

-XP 지원 중단

-광고 제거

-메모리 최적화 (구버전 20MB 이상 5.5.0버전 10MB 미만)

-집계탭에서 각 종 수치 제거

-기타 최적화

 

14.05.08. ver 5.3.0

-MySQL DLL 버전 변경( 5.6.10.0 -> 6.1.3.0 )

-각 종 정적 라이브러리 버전업

-URL 연결 변경

 

14.02.23. ver 5.1.0

-URL 연결 변경

-몇몇 그래프 색상 변경

-기타 수정

 

14.02.23. 서버 변경 이력

※하드웨어 변경 사항

-SSD+HDD -> SSD+SSD

 

※OS 및 소프트웨어 변경 사항

-리눅스 -> 윈도우

-MySQL -> MariaDB

-서버 구동 개수 8개 -> 서버 구동 개수 3개

 

14.02.19. ver 5.0.0

-몇몇 그래프 색상 변경

-URL 연결 변경

-이동시 투명 기능 제거

-프로그램 시작 속도 약간 빠르게 개선

-통계1탭의 끝수 리스트 색상 변경

-집계탭 그래프 내의 몇몇 명칭 및 그래프 간격 변경

-최고 가동 시간 1000분 미만만 나오는 문제 수정

-생성탭 번호 생성 개수 300개에서 500개로 증가

-집계탭 내의 많이 사용한 기능 없애고 접속 정보로 변경

-통계1탭의 전 회차 출현 번호 없애고 끝수 관련 통계 추가

-버전 자리수 변경

 

13.12.12. ver 4.5

-윈도우8 미만에서 프로그램 화면 하얗게 변하는 거 수정

-리스트 항목 Ctrl+C 복사나 메뉴 복사시 이상한 문자들어가는 거 수정

-통계창 세로폭 크기 작게 변경

-통계 1, 2, 3 그래프 내의 몇몇 명칭 및 그래프 간격 변경

-고정수, 제외수 창 색상 변경

-5.0 버전을 위한 테스트 코드 삽입 및 기반 마련

 

13.12.12. ver 4.2

-프로그램 이동시 투명 처리

-"오류 알림" 명칭이 "사용 방법"으로 변경되고 기능도 이름에 맞게 변경

-"로또 통계" 창 크기 작게 변경

-검색탭, 생성탭 "총합", "연번" 컬럼 텍스트 색상 변경

-검색탭, 생성탭 조건 저장/불러오기 추가

-생성탭의 생성 조건 연번 항목에 4쌍, 5쌍 조건 추가

-생성탭에서 "저고 비율", "홀짝 비율", "연번 개수" 항목, 가끔 조건 초기화 안되던거 수정

-검색탭, 생성탭 마킹 그리는 부분 선 두께, 마킹 방법 변경

-집계 데이터 범위 수정, 최근 한 달간의 데이터로 집계 데이터 생성

-집계탭 하위 가동 시간 기준 변경

-집계탭 평균 가동 시간 항목 추가

-통계창 탭에 아이콘 추가, 변경

-통계2탭 홀짝 비율 그래프 제대로 안그려지는 문제 수정

 

13.12.08. ver 4.0beta

-서버 접속 안될 경우 프로그램 실행 안되게 변경

-프로그램 UI(프로그램 사이즈, 탭 구조, 버튼 위치, 기타 위치) 20여 가지 항목 변경

-연번 기준 로또 공식 홈페이지 최신 기준으로 변경(연번 최대 개수 3개 -> 5개)

-검색 탭의 검색 조건에 연번 항목 추가

-"프로그램 통계" 명칭이 "집계"로 변경

-집계탭 하위에 "가동 시간" 항목 추가

-고정수, 제외수 설정 파일로 내보내고 가져오도록 변경

-검색탭, 생성탭 리스트컨트롤 아이템 색상 변경

-프로그램을 얼마나 켜뒀는지 확인할 수 있는 "가동 시간" 버튼이 추가

-생성탭에 "중복 제거" 버튼 명칭 "중복 관련"으로 변경

-"중복 항목 보기" 창 추가

-광고 추가

-생성탭의 "내 번호 입력" 명칭, 입력 방식 변경

-그 밖에 크고작은 수정 및 변경 사항 30여 가지

 

13.12.04. ver 3.8

-3.7 버전 실행 중에 죽는 현상 수정

 

13.11.11. ver 3.7

-프로그램 서버 변경

-당첨 번호를 자동 업데이트 해주던 봇 프로그램 없애고 사용자가 프로그램 실행 시, 자동 업데이트하도록 변경

-검색탭 출력할 항목이 없을때 메시지 박스로 출력할 항목이 없다고 알려주고 작업 중지(기존엔 그냥 작업중지)

-생성탭에 "중복 제거" 버튼 추가

-생성탭 번호 생성 알고리즘 변경

-생성탭 번호 생성 개수 10000개에서 300개로 감소

-생성탭 제한 개수를 초과해도 "내 번호 입력" 되던거 안되게 수정

-프로그램 자체 통계 자료 밸런스 패치

-검색탭에서 "저고 비율", "홀짝 비율", "연번 개수" 항목, 가끔 조건 초기화 안되던거 수정

 

13.11.07. ver 3.5

-프로그램 이름 "오뇽 로또"로 변경

-새로운 통계3탭 추가. 123합, 456합, 첫수합, 간격합, 고저합, 끝수합 그래프 추가

-프로그램 통계 추가.

-프로그램 사이즈 작게 변경(세로 크기 감소)

-서버 연결 안됐을 때 프로그램 실행시 죽는 현상 수정

-검색탭, 생성탭에서 저고 비율, 홀짝 비율, 연번 개수 조건에 체크 탭 추가

-생성탭 저고 비율, 홀짝 비율, 연번 개수의 하위 조건을 라디오 버튼에서 체크 박스로 변경, 다중 선택 가능

-생성탭 몇몇 버튼 명칭 변경

-통계1탭 n회~n회 검색 시 "보너스 번호 포함" 기능 안되던거 수정

-통계2탭에서 총합계 범위가 255인데 225로 나오던거 수정

-통계2탭 "10번대 출현 횟수" 리스트 없애고 총 합계 범위 넓게 변경

-통계2탭에서 ESC 누르면 사라지는 현상 수정

-그래프 색상 변경

 

13.10.29. ver 3.0

-기존에 출력 했던 txt파일 불러오기 기능 추가

-고정수, 제외수 선택 시 전 회차 당첨번호를 기반한 선택 옵션 추가

-통계탭에 원하는 구간만 통계 낼 수 있는 검색 옵션 추가

-새로운 통계2탭 추가. 총합, 구간별 출현 횟수, 저고 비율, 홀짝 비율, 연번 비율 그래프 추가

-검색탭 조건 검색 후 선택된 항목과 그려지는 패턴이 다르던 문제 수정

-에디트 컨트롤 Align 오른쪽으로 변경

 

13.10.28. ver 2.8

-생성탭 내부 자료구조, 알고리즘 수정으로 이전 버전 대비 생성 및 삭제 속도 대폭 향상

   1. 로또 번호 생성 및 삭제시 무조건 리스트컨트롤을 재갱신하는 코드 수정(느린 속도의 주범)

   2. 테스트와 실험을 위한 무의미한 데이터 생성 및 대입, 삭제, 통계 코드 제거

-생성탭에서 로또 번호 최대 생성 개수 10000개로 제한

-특정 환경에서 캘린더 컨트롤 잘리는 현상 수정

-리스트컨트롤 선택 색상 변경

-고정수, 제외수 설정값 자동 저장 기능 추가

-"오류 알림" 버튼 추가

-그 밖에 설명하기 힘든 4건 정도의 소소한 개선사항 수정

 

13.10.16. ver 2.3

-특정 환경에서 숫자 생성시 46 나오던거 수정

 

13.10.16. ver 2.2

-분석탭, 생성탭 리스트 항목 개수 나오도록 텍스트 추가

-생성탭에서 리스트 아이템 지웠을때 기존 마킹 항목 안남도록 수정

-생성탭 조건 초기화 버튼 눌렀을때 생성 개수, 0개에서 1개로 수정

-윈도우8 기준 프로그램 크기 1024x807 에서 880x743으로 작게 수정

-몇몇 단어 명칭 변경

-고정수, 제외수 다이얼로그 색상 수정

 

13.10.15. ver 2.0

-화면 구성 조금 수정

-txt로 출력 기능 추가

-눈 덜 아프게 리스트컨트롤 색상 변환

-리스트컨트롤 아이템 선택 후 포커스를 잃으면 선택 표시 없어지던거 수정

-고정수, 제외수 기능 추가

 

13.10.13. ver 1.9

-생성탭 아무것도 없어도 엑셀 파일로 출력되는 거 수정

-분석탭, 생성탭 리스트컨트롤 선택된 아이템이 없어도 빈 공간 우클릭 되는 거 수정

-기타 예외처리 추가

-프로그램 크기 가로 -9, 세로 -6 작게 사이즈 수정

-일부 버튼 위치, 명칭 수정

-분석탭, 생성탭에 마킹 항목 추가

-새 버전 있을 경우 알림방법 수정

-공지사항 추가

-안정성 하락

 

13.10.01 ver 1.7

-저장은 안되지만 헤더 길이 조절이 가능하도록 수정.

-생성탭 - "생성 번호" 컬럼에 의미없는 보너스 번호 안나오게 수정

-생성탭 - 임의 번호 입력시 중복되는 숫자 입력 못하게 수정

-생성탭 - 무작위 번호 생성시 리스트컨트롤 포커스 자동 이동되도록 수정

-생성탭 - 무작위 번호 생성시 전과 다르게 기존 번호 안지우고 추가

-리스트컨트롤 전 항목 엑셀 파일 출력 기능 추가

-선택한 아이템만 엑셀 파일 출력 기능 추가

-선택한 아이템만 복사 기능 추가(Ctrl+C나 팝업 메뉴로 복사)

-선택한 아이템만 삭제 추가

 

13.09.16. ver 1.3

-통계탭 추가, 통계 기능 구현

-프로그램 중복 실행되지 않게 수정

-프로그램에서 Enter키나 ESC키 누를 경우 각종 컨트롤들이 사라지는 현상 수정

-입력 기능 중 예외처리 기능 조금 추가

-탭명 짤리던 현상 수정

-줄 간격 늘려 보기 편하게 수정

-최소화 버튼 추가

 

13.09.13. ver 1.0

-로또 번호 분석, 생성

 

 

 

'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
Point Cloud  (0) 2013.10.02
넷마블 틀린그림찾기 매크로  (17) 2013.04.01
HSV Cam Viewer  (4) 2013.03.31
HSV Image Viewer  (1) 2013.03.31

넷마블 틀린그림찾기



악용하려고 만든건 아니고 원하는 프로그램을 만들기 위한 중간 과정이라서 공부할 겸 만들어봤습니다


흐름은 대충 그림이 바뀔 때마다 가로인지 세로인지 사용자가 지정해주는데, 지정할 때(그림이 바뀔때)마다 바탕화면 전체에서 템플릿 매칭으로 넷마블 프로그램을 찾아여. 매번 찾아주는 것보다 처음 한 번만 찾는게 구현도 쉽고 속도도 더 빠르지만 가끔 프로그램을 이동시켜야 할 일이 있고, 속도 차이도 요즘 같이 컴퓨터 성능이 상향평준화된 시대에서는 별의미가 없어서 매번 찾는 걸로 바꿨습니다.


넷마블 틀린그림찾기 프로그램을 찾으면 좌우 그림을 이진영상으로 바꾸고 정확도를 위해 차영상을 3개 만들고, 만들어진 3개의 차영상을 마지막에 더해주면 끝 영상처리는 끝. 그 다음 넷마블 틀린그림찾기 프로그램과 제가 만든 프로그램과 화면상에서 매핑하여 내 프로그램을 클릭하면 매핑된 넷마블 틀린그림찾기 프로그램을 클릭합니다.


아래 함수들은 제가 만든 자료형 및 매크로 상수들이 없으므로 다른 곳에서는 사용할 수 없지만 참고용으로 올려봅니다.



RGB영상을 이진영상으로 바꾸는 함수

void CIMAGE::RGB2BinaryImage( _IMAGE& oImgSrc, _IMAGE& oImgDst, int nThreshold )
{
	uchar ucGray;
	long lIdxSrc;	//oImgSrc.image의 인덱스
	long lIdxDst;	//oImgDst.image의 인덱스

	_IMAGE imgTemp;	//oImgSrc와 oImgDst가 같은 변수 일 수도 있으므로 Temp 변수 생성

	imgTemp.initialize( 
		cvSize( oImgSrc.image->width, oImgSrc.image->height ), 
		oImgSrc.image->depth, 
		1
		);

	for( int height=0 ; height < oImgSrc.image->height ; ++height )
	{
		for( int width=0 ; width < oImgSrc.image->width ; ++width )
		{
			lIdxDst = (height * imgTemp.image->widthStep) + (width * imgTemp.image->nChannels);
			lIdxSrc = (height * oImgSrc.image->widthStep) + (width * oImgSrc.image->nChannels);

			//RGB 값을 Gray 값으로 변환
			ucGray = uchar( (oImgSrc.image->imageData[lIdxSrc + 2] + oImgSrc.image->imageData[lIdxSrc + 1] + oImgSrc.image->imageData[lIdxSrc + 0]) / 3 );

			//1채널 영상에 대입
			imgTemp.image->imageData[ lIdxDst ] = ucGray;

			if( ucGray > nThreshold )
				imgTemp.image->imageData[ lIdxDst ] = (uchar)255;
			else
				imgTemp.image->imageData[ lIdxDst ] = (uchar)0;
		}
	}
	oImgDst.initialize( imgTemp.image );

	memcpy( oImgDst.image->imageData, imgTemp.image->imageData, imgTemp.image->imageSize );

	//DisplayWindow( "Binary Image", oImgDst, 10 );
}


차영상 구하는 함수

void CIMAGE::SubImage( _IMAGE& oImgSrc1, _IMAGE& oImgSrc2, _IMAGE& oImgDst )
{
	long lIdxSrc;				//oImgSrc.image의 인덱스
	unsigned char	ucColor;
	_IMAGE imgTemp;				//oImgDst와 oImgSrc1 혹은 oImgSrc2가 같을 수 있으므로 Temp 

	imgTemp.initialize( oImgSrc1.image );

	for( int height=0 ; height < oImgSrc1.image->height ; ++height )
	{
		for( int width=0 ; width < oImgSrc1.image->width ; ++width )
		{
			lIdxSrc = (height * oImgSrc1.image->widthStep) + (width * oImgSrc1.image->nChannels);

			ucColor = (unsigned char)oImgSrc1.image->imageData[lIdxSrc] - (unsigned char)oImgSrc2.image->imageData[lIdxSrc]; 

			if( ucColor > 255 )		//일반적인 차영상 구할때 발생할 일이 없겠지만.. 
				ucColor = 255;
			else if( ucColor < 0 )
				ucColor = 0;		//빼기 연산하면 음수가 나올 수 있으므로

			imgTemp.image->imageData[lIdxSrc] = ucColor;	//보정된 ucColor 값을 입력
		}
	}
	oImgDst.initialize( imgTemp.image );

	memcpy( oImgDst.image->imageData, imgTemp.image->imageData, imgTemp.image->imageSize );

	//DisplayWindow( "Sub Image", oImgDst, 10 );
}


인자로 받은 위치, 사이즈 만큼 캡쳐하는 함수. 여기서는 바탕화면 전체를 캡쳐함

void CIMAGE::captureScreen( HWND hWnd, int x, int y, int width, int height )
{
	BYTE *pImageData;
	BITMAPINFO bmi;

	bmi.bmiHeader.biSize  = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = width;
	bmi.bmiHeader.biHeight = height;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = (((width * 24 + 31) & ~31) >> 3) * height;
	bmi.bmiHeader.biXPelsPerMeter = 0;
	bmi.bmiHeader.biYPelsPerMeter = 0;
	bmi.bmiHeader.biClrImportant = 0;
	bmi.bmiHeader.biClrUsed = 0;

	HDC hDC    = ::GetDC( hWnd );
	HDC memHDC = ::CreateCompatibleDC(hDC);

	HBITMAP hbmOrg = ::CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&pImageData, 0, 0);
	HBITMAP hbmOld = (HBITMAP)::SelectObject(memHDC, hbmOrg);
	HDC desktopDC = ::GetDC(NULL);
	::BitBlt(memHDC, 0, 0, width, height, desktopDC , x, y, SRCCOPY);
	// end of screen capture.

	// make IplImage 
	IplImage *imgDesktop = cvCreateImage( cvSize(width, height), 8, 3 );
	imgDesktop->origin = IPL_ORIGIN_BL;
	memcpy( imgDesktop->imageData, pImageData, imgDesktop->imageSize );
	//...

	if( m_oDesktop.image != NULL )
	{
		cvReleaseImage( &m_oDesktop.image );
	}

	m_oDesktop.image = cvCreateImage( cvSize( width, height ), 8, 3 );
	m_oDesktop.image->origin = 1;

	cvCopyImage( imgDesktop, m_oDesktop.image );

	//DisplayWindow( "Desktop Image", m_oDesktop, 10 );

	if( imgDesktop != NULL )
	{
		cvReleaseImage( &imgDesktop );
	}

	//해제
	ReleaseDC( NULL, desktopDC);
	SelectObject(memHDC, hbmOld);

	DeleteObject(hbmOrg);
	DeleteDC(memHDC);
	ReleaseDC(hWnd, hDC);
}


바탕화면에서 넷마블 프로그램을 찾거나 좌우 이미지를 좀 더 정확하게 찾을 때 사용하는 함수

//반환 값은 원본 이미지에서, 템플릿과 일치하는 좌하단 좌표와 가로, 세로 크기
CvRect CIMAGE::MatchTemplate( _IMAGE& oImgSrc, _IMAGE& oImgTemplate, bool bDesktop )
{
	CvRect cvRt;

	double min_val, max_val;	//상관관계 최대, 최소 값
	CvPoint min_loc, max_loc;	//left_Bottom, Right_top인듯 (윈도우와 OpenCV 좌표 체계가 달라서)

	int width = oImgSrc.image->width - oImgTemplate.image->width + 1;
	int height = oImgSrc.image->height - oImgTemplate.image->height + 1;

	IplImage* m_imgProc = cvCreateImage( cvSize( width, height ), IPL_DEPTH_32F, 1 );

	{//원본 이미지에서 템플릿 이미지와 유사?한 부분을 찾아 min_loc변수에 위치를 저장
		//상관계수를 구하여 m_imgProc에 그림, 이 함수의 특징은  유클리디안 거리를 사용하여 
		//소스 이미지 전체를 탐색하면서 템플릿 이미지와 얼마나 유사한지를 측정
		cvMatchTemplate( oImgSrc.image, oImgTemplate.image, m_imgProc, CV_TM_SQDIFF );

		//위에서 구한 상관계수 맵에서 최대의 유사성을 갖는 값(Max_val)을 cvMinMaxLoc( )를 이용하여 찾음
		cvMinMaxLoc( m_imgProc, &min_val, &max_val, &min_loc, NULL/*max_loc*/ );

		max_loc.x = oImgTemplate.image->width;		//사각형을 그릴때 템플릿 이미지 크기 만큼 그리기 위해
		max_loc.y = oImgTemplate.image->height;		//템플릿 이미지의 가로, 세로 사이즈를 넣어줌

		cvRt = cvRect( min_loc.x, min_loc.y, max_loc.x, max_loc.y );

		if( bDesktop == true )
		{//템플릿 이미지와 바탕화면을 비교해서 넷마블을 찾았는지 못 찾았는지 한 번만 확인하는 부분
			_IMAGE oImgCropNetmarble;	//바탕화면에서 넷마블이라 생각되는 부분을 잘라넣을 변수
			_IMAGE oImgSubTest;			//읽어온 템플릿과 oImgCropNetmarble변수를 빼서 저장할 변수

			long lIdxSrc;
			int nCount = 0;

			oImgSrc.cvRtCropROI = cvRt;

			//관심영역 지정
			cvSetImageROI( oImgSrc.image, oImgSrc.cvRtCropROI );

			oImgCropNetmarble.initialize( oImgTemplate.image );
			cvCopyImage( oImgSrc.image, oImgCropNetmarble.image );

			SubImage( oImgTemplate, oImgCropNetmarble, oImgSubTest );

			for( int height=8 ; height < oImgSubTest.image->height ; ++height )	//읽어온 템플릿 이미지에서 아래 부분을 8 빼느라고
			{
				for( int width=0 ; width < oImgSubTest.image->width ; ++width )
				{
					lIdxSrc = (height * oImgSubTest.image->widthStep) + (width * oImgSubTest.image->nChannels);

					if( uchar(oImgSubTest.image->imageData[ lIdxSrc ]) == 255 )
					{
						//읽어온 템플릿과 바탕화면에서 잘라낸 부분이 동일하다면 0에 가까운 수가 나온다.						
						if( ++nCount >= 5 )
						{
							m_bFoundNetmarble = false;
						}
					}
				}
			}
			//DisplayWindow( "Cropped Netmarble Image", oImgCropNetmarble, 10 );
		}

		if( m_imgProc != NULL )
		{
			cvReleaseImage( &m_imgProc );
		}
	}

	return cvRt;
}


'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
Point Cloud  (0) 2013.10.02
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
HSV Cam Viewer  (4) 2013.03.31
HSV Image Viewer  (1) 2013.03.31



HSV Cam Viewer.zip

Desktop.7z.001

Desktop.7z.002

Desktop.7z.003

Desktop.7z.004


프로그램 실행하려면 OpenCV1.0은 필수로 설치해야함


HSV Image Viewer가 Image를 읽어와 처리하는 정적 이미지(정지 영상) 기반이라면 HSV Cam Viewer는 PC캠에서 받아오는 실시간 이미지를 처리하는 것입니다. Image Viewer는 하루? 이틀 정도 걸려 만들었고.. Cam은 삽질 좀 하느라 일주일 정도 걸린듯요ㅠㅠ


Cam Viewer에는 간단한 크로마키 기능도 추가 됐습니다. 아래 동영상 2개 보면 크로마키에 대해서 대충 감이 옵니다 



크로마키 할 때 중요한게 카메라의 성능과 주변에 흔하지 않은 색(울트라마린 블루=크로마키색) 등인데, 집에 있는 카메라는 성능도 달리고 마땅한 배경도 없어서 아쉽네여..



아래부터 프로그램 캡쳐

 



'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
Point Cloud  (0) 2013.10.02
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01
HSV Image Viewer  (1) 2013.03.31


HSV 색상 모델로 레이저 트래킹 하려고 HSV에 대해 알아보다가 마틴이란 분의 블로그에 들리게 되었고, 거기 있는 프로그램 보고 몇 가지 더 추가해서 한 번 만들어봤습니다.


RGB나 YCbCr, YIQ, CMYK 등의 색상 모델은 대체로 시스템이나 하드웨어에서의 사용을 위해 만들어진 색상 모델이라면HSV(Hue Saturation Value)란 간단히 말해서인간의 색인지에 기반을 둔 사용자 지향성 색상모델입니다.


인간이 색을 인지하는 방식이 직관적이고 자연스럽기 때문에 HSV 컬러 모델은 시각 예술에 자주 쓰인다고 하네요. 일상에서도 자주 쓰이는데, 오렌지 색을 표현할 때 RGB성분으로 R=245, G=110, B=20으로 표현하는 것보다는, 색상(H)은 오렌지색이며 명도(V)는 밝고 채도는 짙다고 표현하면 어떤 색인지 금방 떠올릴 수 있을 것입니다. 이처럼 인간이 색을 표현할 때 자주 사용하는 표현 방법이 HSV 표현과 비슷하다고 합니다.


아래는 HSV 색 공간 모형


아래는 RGB를 HSV로 변환하는 공식



아래는 프로그램 이미지 입니다.







'프로그래밍 관련 > 자작 프로그램' 카테고리의 다른 글

각도기 프로그램  (60) 2013.11.28
위경도 도, 도분, 도분초 변환  (19) 2013.10.17
EXIF Viewer, EXIF 뷰어  (7) 2013.10.05
Point Cloud  (0) 2013.10.02
무료 로또 프로그램 - 오뇽 로또  (393) 2013.09.13
넷마블 틀린그림찾기 매크로  (17) 2013.04.01
HSV Cam Viewer  (4) 2013.03.31

+ Recent posts