Win32 API에서 영상처리를 위해 이미지로부터 픽셀 배열 얻어오기

Mobile Programming/Windows Mobile 2010. 10. 25. 21:19

먼저 대단히 좋은 참고가 된 지식인 유저분과, 이 지식인을 찾기 위해 함께 고생해주신 우리 06학번 오빠한테 감사하다는 말씀을!
 http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67833701&qb=aGJpdG1hcCDtlL3shYAg7Ja77Ja064K06riw&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gKSisv331xCsscnLn1Vssv--272669&sid=TMVVR@dHxUwAAGI6EQQ


윈모는 아니지만, 모체가 되는 API에 대해 글 하나 올리려합니다 ㅋ

그동안 영상처리를 위해 픽셀을 받아오는 건 그냥 와인라벨하던 프로젝트의 솔루션 기본 파츠를 그냥 그대로 들고오던거라 어떻게 얻어오는지 전혀 몰랐습니다.

지능시스템을 위해서 영상처리가 필요했는데 , 역시 픽셀을 얻어오는 것이 선행되어야 합니다.
DDB(Device Dependent Bitmap)는 처리속도가 낮고 배열로 취급하기가 어려워
DIB 이미지에서 픽셀배열을 얻어오는편이 편하다고 합니다.

1차원 배열을 얻어오는 점이 아직 문제가 되긴 합니다만 , 
어쨋거나 DIB에서 픽셀배열을 얻어오는데 필요한 구조체는

1. DIBSECTION
2. RGBTRIPLE (여기에 RGB값이 들어있습니다)

입니다 .

#define HBYTES(w, b)  ((((w) * (b) + 31) & ~31) / 8)

	hBitmap = (HBITMAP)LoadImage(NULL, Path, IMAGE_BITMAP, 0, 0,
		LR_LOADFROMFILE | LR_CREATEDIBSECTION);
	DIBSECTION dib;

	GetObject(hBitmap, sizeof(DIBSECTION), &dib);

	DWORD cbHBytes = HBYTES(dib.dsBmih.biWidth, dib.dsBmih.biBitCount);//cbhbyte : 수평바이트수
	if(dib.dsBmih.biBitCount == 24) {//RGB데이터일때만
		int im_Height = dib.dsBmih.biHeight;
		//DIB는 Y좌표가 상위로 갈수록 +. 따라서 높이 - 정상좌표가 바뀐 역방향좌표.
		int p = (dib.dsBmih.biWidth * (im_Height-550)) + 270;			
		int x = p % dib.dsBmih.biWidth;
		int y = p / dib.dsBmih.biWidth;
		RGBTRIPLE* p1 = (RGBTRIPLE*)((LPBYTE)dib.dsBm.bmBits + y * cbHBytes) + x;
		p= p;
	}

DIB는 Y좌표가 상위로 갈수록 증가한다는 사실을 유의합니다.
먼저 얻어온 path에 따라서 이미지를 메모리에 로드하고, 그 핸들을 저장합니다.
그리고 핸들을 이용해서 DIBSECTION의 정보 초기화,
24비트(RGB , 8비트-255까지니까-씩.)일때만 p로 픽셀위치를 얻어오고 RGBTRIPLE을 이용해 그 RGB값을 얻어옵니다.

이를 응용해서 배열로 받아오는 함수를 작성하면,

RGB_Trip ** makeRGB(DIBSECTION dib,int * height, int * width){

	*height = dib.dsBmih.biHeight;
	*width = dib.dsBmih.biWidth;

	RGB_Trip ** RGBImage = new RGB_Trip*[*height];

	for(int i =0; i < *height; i++){
		RGBImage[i] = new RGB_Trip[*width];
	}

	DWORD cbHBytes = HBYTES(dib.dsBmih.biWidth, dib.dsBmih.biBitCount);//cbhbyte : 수평바이트수
	if(dib.dsBmih.biBitCount == 24) {//RGB데이터일때만
		int im_Height = dib.dsBmih.biHeight;
		//DIB는 Y좌표가 상위로 갈수록 +. 따라서 높이 - 정상좌표가 바뀐 역방향좌표.
		//int p = (dib.dsBmih.biWidth * (im_Height-550)) + 270;
		for(int i = 0; i < *height; i++){
			for(int j = 0; j < *width; j++){
				int p = dib.dsBmih.biWidth*(im_Height-i)+j;
				int x = p % dib.dsBmih.biWidth;
				int y = p / dib.dsBmih.biWidth;
				RGBTRIPLE* p1 = (RGBTRIPLE*)((LPBYTE)dib.dsBm.bmBits + y * cbHBytes) + x;
				RGBImage[i][j] = p1;
			}//j

		}

	}//if

	return RGBImage;

}

직접 개발한 프로그램 - 친구 위치 찾기

Developed Program/Android 2010. 10. 23. 16:40


20010 년도 5월쯤 프로젝트
개발기간 - 1~3 주..?
사용 플랫폼 - Android OS 1.5
사용 단말기 - Andro One (French Edition)



Android를 처음 접한건 연구실 처음 들어왔을 때니까,
2년쯤 전인데 그 긴 시간동안 무슨 목적의식을 갖고 만든 프로그램은 없었네요.
(Android 쬐끔 만지다가 와인라벨과 메뉴판 인식에 전념을 다하게 된 것도 그 이유 중 하나라고 생각합니다만)
먼저 안드로이드 공부를 다 끝내고 프로그램 기획을 하자 !
그정도 생각이었을거라 봅니다 .ㅎ

결국 뭔가 프로그램 다운건 이것 뿐이네요 .

프로그램은 .. 간단합니다.
요새 논란이 되고 있는 "오빠믿지 ? " 어플과 목적이 같습니다.
교수님이 처음 제안서를 받고 이런 위치 추적 문제가 되지 않겠냐고 우려하시던 모습이 떠오르네요..



이 어플은 상기 그림을 보시면 아시겠지만 Java로 구현된 서버 프로그램이 제 컴퓨터에 돌고 있어야 구동가능합니다.
고로 마켓에 올린다거나하는 번거로운 일은.. 하지 않았습니다.

프로그램의 구조는 다음과 같습니다.


서버, 앱 모두 스레드가 다중이라는 점에서 유발되는 Handling,
서버와의 통신을 담당하는 액티비티를 하나만 만들었기 때문에
( 한번의 Connection의 Close , Open을 괜히 복수로 하고 싶지 않았습니다. 연결이 불안정 할테니까요.. )
각 Activity 간의 통신으로 여러 정보를 주고 받아야 되는 점에서 유발되는 PutExtra, BR 등이 조금 번거롭게 만들긴 했죠.

내 위치는 햄토리로, 친구 위치는 햄토리 여자친구로 나왔는데,
역시 제가 마켓에 출시할 생각이 전혀없었기 때문에 문제 없었습니다.

주요기능은

1. 내 주소록 DB에 Access, 친구목록을 가져옴
2. 친구와 대화 가능
3. 친구와 통화 가능
4. 친구와 문자 가능
5. 귀여운 햄토리로 내 위치 확인
6. 귀여운 햄토리 여자친구로 친구 위치 확인


다음은 구동 이미지입니다.


핸드폰을 들고있는 사람(햄토리)는 움직이지 않고 햄토리 여자친구의 이동을 확인 할 수 있습니다.


후에 동영상 첨부 합니다...

'Developed Program > Android' 카테고리의 다른 글

이거슨 심심풀이 프로젝트 ? - Geng's Minihome  (2) 2010.11.12

넥서스원 , 2.2.1 업데이트

도움될지도? IT 정보 2010. 10. 23. 15:49

다른 안드로이드 폰들이 이제 프로요(2.2)로 업데이트가 됐을때!!
넥서스원은 2.2.1 이다 !!




넥서스원 유저분들이 가장 자부심을 가지는 레퍼런스 폰의 최대 강점, 그 어느 안드로이드 단말기보다 빠른 업데이트!

KT쪽에서 구글에서 공급한 2.2.1을 막았다하여 유저 여러분들의 불만이 많았죠.
준비할게 있었다나 ?

10월 22일자로 OTA가 가능하게 되었습니다.
관련 기사 ->  http://news.etomato.com/news/etomato_news_read.asp?no=117457

OTA( 기존 방송이 송출중단되거나 신규 방송이 생길때에 수신기 회사에서 변경된 채널자료등을 위성을 통해 자동으로 업그레이드 해주는 기능입니다. )

[출처] OTA란 무엇인가?|작성자 마틴신



사실 저는 SKT에서 KT전용 넥서스원을 사용하는 유저라 뭐 KT에 왈가왈부할 입장도 아니고 ,
OTA 업데이트를 기대한 입장도 아니었는데 오늘 아침에 Notification 으로 "시스템 업데이트가 있습니다" 가 있더군요 ㅎ
냉큼 실행했죠.

넥원이 유저분들이 바라는 업데이트 주 내용은

1. MAC 주소가 00으로 시작하지 않는 넥서스원의 경우 절전모드(스크린이 꺼짐)에 들어가면
와이파이 연결도 함께 끊기는 버그 해결
본인의 맥주소 확인  - 설정 > 휴대전화 정보 > 상태 > Wi-Fi MAC 주소

이 버그때문에 KT 에서 보상차원으로 데이터 1G 무료 제공을 했었죠.
저는 SKT라 물론 혜택을 받지 못했습니다만.........................

2. 넥서스원의 터치오류 해결
넥서스원 가끔 터치가 엉뚱한데로 먹는 버그가 있습니다.
절전모드로 들어갔다가 다시 켜면 대부분 풀립니다만.

정도 였을까요 ?

다음은 KT에서 공개한 2.2.1의 업데이트 내용입니다.

다음은 hTC로부터 확인한 업그레이드 상세 내용입니다.

1. 기존 해외 롬 (os 2.2.1) (약 4M)

2. 한글 키보드 외 로컬라이징 작업(약 5M)


- 한글 키보드
- 비상전화 설정
- 카메라 설정음 처리 등

3. 퀄컴QSD8250칩 패치 적용 (약 12M)

- Buffer overflow vulnerability in processing of GSM L2 messages
- Buffer overflow vulnerability in PS call accept processing
- Buffer overflow vulnerability in processing Attach Accept message
- Buffer overflow vulnerability in processing Emergency Num List IE in Registration Accept Message


Wi - Fi 버그 수정

http://smartblog.show.co.kr/321


터치 오류는 다음 패치에 적용할 예정이라합니다.
wifi 버그는 완벽히 수정되었다고 하는데 몇몇 유저분들 포털에서 보면 가끔씩 또 끊기곤 한다고합니다.
(그래도 대부분은 훨씬 나아졌다고 합니다. 저는 아직 끊기는 현상을 발견하지 못했구요._)

3의 퀄컴칩 패치 덕분인지,

1. 갤러리 딜레이 감소
2. 웹서핑 속도 증가
3. SD 카드 로딩 속도 개선

등이 느껴집니다.!

또 Youtube 어플이 다운로드 되지 않았는데 이제 된다고 하죠 !

0.0.1 업데이트 치고는 많은 점들이 개선된거 같습니다.

아직까지 notification이 뜨지 않은 분은

전화걸기 창에서

*#*#2432546#*#*

명령어를 치면 시스템 확인을 한다고 합니다.
이 점은 제가 직접 실행해 보지 않았기 때문에 장담은 못드리겠군요.