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.8.1.zip
2.26MB

 

프로그램의 목적은 로또 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