MFC 재배포 DLL

by Blogger 하얀쿠아
2011. 6. 16. 16:12 소프트웨어 Note/C++ MFC

MFC 재배포 DLL

간단한 MFC용 ODBC을 배포하려고 하는데 필요한 DLL을 확인해보았습니다.

프로젝트 형식은 [Win32]-[Win32 콘솔 응용 프로그램]이고

템플릿 마법사(응용 프로그램 설정)에서 추가 옵션에 '미리 컴파일된 헤더'에 체크 및
공용 헤더 파일 추가 대상에 'MFC' 에 체크하였습니다.

 

미리 컴파일된 헤더(PCH) 헤더 파일인 stdafx.h에 TODO 부분에

  1. #include <afxdb.h> // MFC ODBC

를 추가하고

 

main함수가 있는 cpp 파일에

  1. CDatabase db;
    BOOL res = db.OpenEx(TEXT("~~~~));   // ~~~~부분에는 ODBC 연결 문자열이 들어갔습니다.
    if(res) {
        db.ExecuteSQL(TEXT("Insert into ABBA.dbo.user_info (id, name) values ('1', 'value');"));
    }

를 하여 Insert문을 수행하였습니다.

 

Release 모드에서 빌드를 하고(속성의 C/C++의 '코드 생성'부분의 런타임 라이브러리는 /MD로 되어 있습니다.)

런타임 라이브러리 사용 지정 방법은 MSDN의 /MD, /MT, /LD (Use Run-Time Library)를 참고하세요.


 필요한 DLL들

mfc90u.dll - MFC의 CDatabase 클래스를 사용했기 때문에 DLL에서 사용할 수 있게

msvcr90.dll - /MD 옵션으로 코드생성을 하게 되면 C Run-Time 라이브러리로 이 DLL이 필요합니다.

(참고로 VS 2008에서 개발을 할 때의 경우입니다. VS 2005라면 90대신 80이라는 숫자가 붙습니다)

 

MSDN의 C Run-Time Libraries를 보면 표준 C++ 라이브러를 사용했을 경우에 msvcp90.dll 이 필요하다고 하네요.

 배포할 DLL은 어디서 구하나?

VS2008을 설치할 때 경로를 바꾸지 않았다면

C:\Program Files\Microsoft Visual Studio 9.0\VC\redist 에 배포용 파일이 있다.

x86기반과 amd64, 디버그용 배포하지 말아야할 카테고리 3가지 폴더 아래 파일이 있다.

 
네이트온의 배포 DLL

NATEON 4.0.10.4(1481)을 기준으로 아래와 같은 dll 파일들이 배포가 된다.

(위치 : C:\Program Files\NATEON\BIN)

 nateon4.png

DIR 한 목록

2004-08-24  오후 11:14           640,000 dbghelp.dll
2005-06-28  오전 10:14           356,352 MWDatabase.dll
2005-06-28  오전 10:14           286,773 MSVCRT.DLL
2005-10-07  오전 02:17           258,352 unicows.dll
2005-10-18  오전 06:20           118,272 t2embed.dll
2006-12-01  오후 10:03           626,688 msvcr80.dll
2006-12-01  오후 10:03           548,864 msvcp80.dll
2007-03-02  오후 08:34            61,440 NateOnHook40u.dll
2007-04-04  오후 11:18           126,976 NateMessengerApiActiveX.dll
2008-08-06  오후 04:35            61,541 XecureCSP.dll
2008-08-06  오후 04:35           393,302 XecureCrypto.dll
2008-08-06  오후 04:35            41,059 XecureIO.dll
2009-08-03  오후 01:15            77,824 NateOnUnhandledExceptionFilter.dll
2009-10-19  오후 05:14           278,528 CKAppEx.dll
2010-05-07  오후 01:49           159,744 libCommonDlg_DLL.dll
2010-05-07  오후 01:49         1,052,672 NateOnResDLL_KOR.dll
2010-05-07  오후 01:49           438,272 SLDB.dll
2010-05-07  오후 01:49           561,152 SRControl.dll
              18개 파일           6,087,811 바이트

msvcr80.dll과 msvcp80.dll을 보면 VS 2005로 개발된 것을 알 수 있다.

 

이 댓글을 비밀 댓글로

POV - 회전 잔상 LED디스플레이

by Blogger 하얀쿠아
2011. 6. 11. 11:02 수행 프로젝트 이력/회전 잔상 디스플레이(AVR)[2011.04~06]

2011년 1학기 마이크로프로세서응용 과목 텀프로젝트

파란색 고휘도 LED8개와 ATmega128 2개를 사용하여 만들었다.
빠르게 회전시켜 남는 잔상으로 문자를 표시한다.

안드로이드 스마트폰 어플리케이션을 만들어 ATmega128과 블루투스로 통신을 하게끔 하여,
디스플레이 할 문자를 폰으로 입력, 전송하여 변경할 수 있다.
또한 디지털시계 모드, 텍스트표시 모드로 분리해두어 이역시 블루투스로 제어하여 모드 변경을 한다.


본 프로젝트 진행시 개발한 안드로이드용 블루투스 Application 소스코드는 하단 링크에서 다운로드 받을 수 있습니다.







위 안드로이드 어플리케이션은 아래 링크를 통해 다운로드 받으실 수 있습니다.


bluetooth_pov_controller.zip



** 회로도 추가 **

 

ATmega128 스키매틱입니다.

GPIO 핀 중 PE0, PE1를 Rxd0, Txd0 로 동작하도록 합니다.

 

 

 

 

 

 

 

 

FB155BC 회로도 입니다.

 

if (보고서에 포함된 소스코드를 그대로 사용하려면 == true) {

  RXD와  TXD를 ATmega128 의 Txd0 , Rxd0 에 각각 연결해 주면 됩니다.

} else {

  Txd1 Rxd1 을 사용해도 무방함

}

 

 

 

**************************************************************

2013.10.29. 문자생성 작업 엑셀 파일 추가.

'문자생성작업' sheet 를 참조 하면 됩니다.

왼쪽 사각형 영역(A1 ~ G8)에 원하는 형태로 문자를 만드시면 됩니다.

1을 넣으면 오른쪽 영역(K1~Q8)에서 2진수 값을 자동으로 생성해 주고, 최종 생성된 배열 형태의 값은 변환결과 영역(노란색표시된영역) 에 출력되게 됩니다. 해당 값을 소스코드 붙여넣으면 쉽게 원하는 형태의 문자를 만들 수 있습니다.

다운로드는 아래 link click

잔상LED_문자생성작업.xlsx



 


 

 


 

이 댓글을 비밀 댓글로
  1. 이전 댓글 더보기
    • 임수
    • 2014.06.22 20:38
    어떤 모터를 사용했는지 알 수 있을까요?
    • 표태희
    • 2014.08.26 09:51
    레포트를 저희도 구매했는데
    회로도가 없어서 ㅠㅠㅠ보내주시면 감사하겠습니다
    cki1109@naver.com
    • 표태희
    • 2014.08.26 09:54
    레포트를 저희도 구매했는데
    회로도가 없어서 ㅠㅠㅠ보내주시면 감사하겠습니다
    cki1109@naver.com
    • 표태희
    • 2014.08.26 09:59
    레포트를 저희도 구매했는데
    회로도가 없어서 ㅠㅠㅠ보내주시면 감사하겠습니다
    cki1109@naver.com
    • 2014.11.09 15:36
    비밀댓글입니다
    • BlogIcon Ko
    • 2014.11.09 15:39
    블루투스 설정관련 질문 하겠습니다 ㅜㅜ 블루투스 모듈을 fb155bc 가 아닌 jmod bt 1 을 사용하였는데 코드는 그대로 사용할수있나요? 지금 페어링 까지는 됬는데... 여기서 글씨를 입력해도 변하지가 않네요 ㅜㅜ 뭐가 잘못된건질 모르겠어요 ㅠ
    • jmod bt1과 Process (여기선 AVR이 되겠죠) 의 interface 부분만 수정해 주시면 될 것 같습니다.
    • 2014.12.09 12:33
    비밀댓글입니다
    • 2015.07.01 23:37
    비밀댓글입니다
    • 2015.09.02 18:05
    비밀댓글입니다
    • 2015.10.03 13:34
    비밀댓글입니다
    • 2015.10.03 13:36
    비밀댓글입니다
    • a
    • 2015.10.27 16:46
    안녕하세요 문서를 사서 만들었는데요 하드웨어까진 했는데 소스를 씨언어랑 자바랑 섞여있는것 같은데 아트메가 128에 소스를 넣으려면 어떤 프로그램을 써야하나요? 지금 코드비전이랑 avr 스튜디오만 가지고 있는데ㅠㅠ 모터부분을 코드비전에 넣었더니 작동이 안되네요ㅠㅠ
    그리고 LED부분 소스는 코드비전 정품을 사신건가요? 평가판은 용량이 초과되네요ㅠㅠ
    • 2015.11.02 17:17
    비밀댓글입니다
    • 정병운
    • 2015.11.18 18:28
    안녕하세요! 이 보고서를 기반으로 해서 제품을 만들었습니다.
    모터도 학교에 있던 똑같은 모터를 사용했구요
    손으로 잡고 돌려볼때는 잘 돌아가는데 글루건으로 모터를 합판 같은데 고정만 시키면
    돌아가질 않네요... 이런문제는 없으셨나요? 있으셨다면 어떻게 해결하셨나요?
    • help
    • 2015.11.24 12:03
    안녕하세요.
    구매한 레포트에 회로도가 없어서 그런데 회로도 좀 메일로 보내주세요.
    그리고 회로도 있으신 분들도 보내주시면 감사하겠습니다.
    laypon@naver.com
    • 지수찡
    • 2016.11.19 13:07
    모터는 뭘 사용하셨나요?
    • 도와주세욧
    • 2018.03.26 17:17
    죄송하지만 회로도와 부품리스트 보여주실수 있나요..제발 부탁드립니다 ㅠㅠ
    • 도와주세욧
    • 2018.03.26 17:18
    jkl0127@naver.com 정말 만들어서 멋진 작품으로 한번 졸업하고 싶습니다
    • 조여송
    • 2018.04.06 13:48
    정말 좋은 작품들 많이 구경하고 갑니다! 저도 구경하기에 그치지 않고 저도 직접 만들어보고싶은데 저도 부품리스트좀 보내주실수있나요? ionstom02@naver.com 입니다.! 위에 분보다 더 멋진 작품을 만들고싶습니다.
    • 최인규
    • 2018.09.16 17:23
    좋은 작품 눈 호강 감사합니다 ^^
    한번 만들어보려고 하는데 부품과 회로도좀 부탁드려도 될까요
    rmeoaka1@Naver.com

해시 테이블에 대하여 (about Hash Table)

by Blogger 하얀쿠아
2011. 6. 11. 10:43 소프트웨어 Note/Algorithm

해시 테이블은 한마디로

 

공간을 팔아 시간을 사다

 

라는 말로 표현할 수 있다. 주소를 이용해서 배열같이 직접 탐색이 가능하다.

 

해시테이블의 기본 개념은 다음과 같다.

 

데이터를 담을 테이블을 미리 크게 확보해 놓은 후 입력받은 데이터를 해시하여

테이블 내의 주소를 계산하고 이 주소에 데이터를 담는 것,

 

이것이 바로 해시 테이블의 기본 개념이다.

해시테이블은 특이하게도 데이터가 입력되지 않은 여유공간이 많아야 제 성능을 발휘할 수 있다.

 

테이블 내의 주소를 계산할 때는 해시함수를 이용하는 데 이에는 두가지 방법이 사용된다.

 

1) 나눗셈법

 주소 = 입력값 % 테이블의 크기

 하지만 이는 충돌과 클러스터 문제가 발생할  가능성이 높다.

 

2) 자릿수 접기

 Hello -> 72 + 101 + 108 + 111 = 500

 하지만 이는 문자열 키가 고정일 경우 해시테이블의 전체크기를 전부 활용못할 수가 있는데,

이는 따로 루프 반복시마다 왼쪽으로 남은 비트씩 끌어올림으로써 해결 할 수 있다.

 하지만 이 역시 충돌 문제는 해결하지 못한다.

 

 

그래서 충돌문제 해결을 위한 방법이 등장한다.

1) 개방 해싱(Open Hashing) : 해시 테이블의 주소 바깥에 새로운 공간을 할당하여 문제를 수습

2) 폐쇄 해싱(Closed Hashing) : 처음에 주어진 해시 테이블의 공간 안에서 문제를 해결

 

 

 개방 해싱 기법에는 Chaining이 있는데 이는 해시 테이블이 데이터 대신 링크드 리스트에 대한

포인터를 관리한다. 링크드 리스트에 데이터 삽입 시에 테일 다음에 붙이면은 탐색비용이 소요되므로

헤드에 붙인다.

 

 체이닝은 순차탐색으로 해시테이블의 '극한의 탐색'을 위해 고안된 성능을 훼손시키므로

해시테이블 + 이진트리탐색( 특히 레드 블랙 트리)를 사용하여 이 문제를 해결한다.

 

 개방 주소법(Open Addressing)은 충돌이 일어날 때 해시 함수에 의해 얻어진 주소가 아니더라도

얼마든지 다른 주소를 사용할 수 있도록 허용하는 충돌 해결 알고리즘이다.

 이에 비해 체이닝은 해시 함수에 의해 얻어진 주소만 사용하므로 오픈 해싱 기법인 동시에

폐쇄 주소법(Closed Addressing) 알고리즘이기도 하다.

 

 개방 주소법은 탐사가 중요하다.

 

1) 선형탐사(Linear Probing) : 가장 간단한 탐사방법으로 해시 함수로부터 얻어낸 주소에 이미 다른 데이터가

입력되어 있음을 발견하면, 현재 주소에서 고정 폭(예를 들면 1)으로 다음 주소로 이동. 클러스터 문제가 발생한다.

즉 클러스터가 발생하면 새로운 주소를 찾기위해 수행하는 선형 탐사 시간이 길어지고 이로 인해 해시 테이블의

성능은 엄청나게 저하된다.

 

2) 제곱탐사(Quadratic Probing) : 선형 탐사가 다음 주소를 찾기 위해 고정폭만큼 이동하는 것에 비해

제곱탐사는 이동폭이 제곱수로 늘어나는 점이 다를 뿐이다. 이 역시도 클러스터 문제가 발생한다.

 

3) 이중 해싱(Double Hashing) : 클러스터 발생 방지를 위해 탐사 주소의 규칙성을 없애버린다. 한가지 아이디어로

rand()를 이용한 난수를 생각할 수도 있겠지만 같은 키를 입력하면 항상 같은 해시 값(주소)를 얻을 수 있어야

하는데, rand()함수를 이요하면 항상 다른 값을 얻게 되므로 적절한 답은 아니다. 이중 해싱은 이동폭을 제2의

해시 함수로 계산한다. 즉 2개의 해시 함수를 준비해서 하나는 최초의 주소를 얻을 때 사용하고 또 다른 하나는

충돌이 일어났을 때 탐사 이동폭을 얻기 위해 사용한다.

 

 만약 아무리 성능이 뛰어난 충돌 해결 알고리즘도 해시 테이블의 여유공간이 모두 차버려서 발생하는 성능 저하는

당해낼 방법이 없다. 그래서 남은 공간이 거의 없는 해시 테이블에서는 허구헌날 연쇄충돌이 일어날 것이다.

 재해싱(Rehashing)은 이 문제를 해결할 수 있는 방법 중 하나로, 재해싱은 해시 테이블의 크기를 늘리고

늘어난 해시 테이블의 크기에 맞추어 테이블 내의 모든 데이터를 해싱한다.

 

 통계적으로 해시 테이블의 공간 사용률이 70% ~ 80% 에 이르면 성능 저하가 나타나기 시작한다. 그러니 재해싱을

이 전에 수행해야 성능저하가 나타나는 것을 막을 수 있다. 하지만 재해싱 역시 만만치 않은 오버헤드를 요구하기

때문에 재해싱을 수행할 임계치를 너무 낮게 잡는 것도 성능 저하의 원인이 되므로, 임계치는 75% 정도를

사용하는 것이 보통이다.

참고 문헌 : 뇌를 자극하는 알고리즘(한빛미디어, 박상현 저)

 

[출처] 해시 테이블에 대해서|작성자 힝아

이 댓글을 비밀 댓글로

OpenCV 2.2 - Visual Studio2010 에 설치하기

by Blogger 하얀쿠아
2011. 5. 24. 19:19 소프트웨어 Note/영상처리

OpenCV 2.2부터는 VS2010용 pre-compiled 버전(VS2008도 사용 가능)이 나온 동시에 OpenCV의 라이브러리들이 대대적으로 정리되고 이름들도 많이 바뀌어서 예전에 만들어둔 프로젝트를 돌리는데 문제가 좀 생기게 되었습니다. 새 버전에 어서 적응하는 방법 밖에 없겠습니다. 허허허헛...

 

2.1에 비해 달라진 점 중 눈에 띄는 몇 가지는 다음과 같습니다.

 - 라이브러리들의 재정리 및 이름 변경

 - 새로운 스테레오비전 알고리즘 등의 최신 기술을 사용한 알고리즘 다수 추가

 - 약 200여 가지의 대대적 버그 수정 (아직 부분적으로 메모리 누수 현상이 있다고 합니다)

 - NVIDIA의 OpenCV에 대한 공식 지원 (CUDA 라이브러리와의 연동으로 데이터 연산에 3D 가속 기능 사용 가능)

 

개인적으로는 3D 가속 기능이 가장 마음에 드는데 CUDA와의 연동을 위해서는 CMake를 이용하여 새로 빌드하는 과정이 필요하므로 여기에서는 다루지 않겠습니다. 나중에 시간이 되면 따로 정리해서 포스팅하죠. 여기에는 VS2010에서 기본적인 코드를 돌리기까지의 방법만 정리해 놓겠습니다. VS2010은 이미 설치되어 있다는 가정 하에 적도록 하겠습니다.

 

*** 설치 정도는 다 알아서 하시는 분들은 바로 PART II VS2010에서의 기본 설정 부분으로 넘어가세요~~

 

PART I   OpenCV 2.2 설치

 

1) 아래의 주소에서 미리 컴파일된 버전인 OpenCV-2.2.0-win32-vs2010.exe를 받습니다. 32비트용이므로 64비트 OS를 쓰시는 분들은 CMake를 사용해서 컴파일 해서 쓰셔야 됩니다.

 http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.2/



여기에서 맨 아래 38.9메가 짜리를 받으시구요.

 

 

2) 다운받은 설치파일을 실행합니다. 기본값들로 다음,다음,다음.. 버튼들을 마구 눌러주다가~! 아래의 화면에서 'Add OpenCV to the system PATH for all users'를 선택해 줍니다. (현재의 계정에서만 라이브러리를 사용할 경우 for current user를 선택하셔도 됩니다) 라이브러리의 경로가 시스템 환경변수에 등록되어, 프로젝트 실행때마다 dll 파일들을 프로젝트 폴더로 복사해야 하는 수고를 덜어줍니다.

 

** 수동으로 하시려면 첫번째의 Do not ... 이 선택된 상태로 설치하신 후, 내 컴퓨터의 등록정보에서 OpenCV가 설치된 경로의 bin 폴더를 경로로 추가해 줍니다. (기본 경로에 설치시 C:\OpenCV2.2\bin을 추가하시면 되겠죠)

경로 추가에 익숙하지 않은 분들을 위해 조금 더 덧붙이자면...세미콜론을 포함한, ;C:\OpenCV2.2\bin을 붙이시는 겁니다 (아래의 화면을 참고하세요)

Path 부분을 선택하시고...

 


이렇게 입력해 주시면 됩니다.

 

PART II VS2010에서의 기본 설정

 

이제 코드를 작성하기 위한 본격적인 설정 부분입니다. 프로젝트 속성 페이지에 들어가서 뭔가를 만져주고 하던 것들이 2.2에서는 거의 필요가 없습니다. 이전에 VS2008+ OpenCV 2.1 TIPs에 적었던 내용을 응용하면 2.2에서는 더 간단하게 코드에서만 거의 모든 설정을 완료할 수 있습니다. 그걸 설명하려는 것이죠 ㅋ _ㅋ) 일반적인 방법은 뒷부분에 적어두겠습니다.

 

* 설치 경로가 C:\OpenCV2.2 기준이므로 다른 곳에 설치하신 분들은 해당 위치에 맞게 바꿔주시면 됩니다.

 

1) 프로젝트 속성 페이지에서 [구성속성] -> [C/C++] -> [일반] -> [추가 포함 디렉터리] 부분에

 

C:\OpenCV2.2\include

 

라고 적어줍니다. 속성 메뉴에서 해야하는 건 이게 끝입니다. 이전 버전에서 라이브러리 이름을 하나하나 추가해주고 하던 삽질(?)이 이제는 이거 하나로 줄었습니다.

 

 

2) 대신에 코드 부분에서 적어야 하는 분량이 약간 늘었습니다만... 텍스트 파일로 만들어두고 필요할 때 복사해서 쓰시면 되겠네요. 코드 나갑니다. 바뀐 라이브러리들의 이름도 살펴보세요.

 

#include "stdafx.h"
#include "opencv2\\opencv.hpp" // 핵심입니다. 이것 때문에 1) 항목이 있는거죠.

                                                       // 주의 할 점은 stdafx.h 뒤에 붙이셔야 한다는 겁니다.

 

// 여기부터는 복사해서 쓰세요. 라이브러리의 이름들도 바뀌었고, 경로까지 포함해주셔야 합니다.

 

// ----------->8--------------- 절취선 --------------------

#ifdef _DEBUG
    // 디버그 모드에서 사용되는 라이브러리들입니다. (끝에 d가 붙죠)

    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")
    // 필요에 따라 추가할 수 있는 라이브러리들

    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")
#else
    // 릴리즈 모드용

    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib") 
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")
    // 필요에 따라 추가할 수 있는 라이브러리들

    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")
#endif

// ----------->8--------------- 절취선 --------------------

 

// 아래는 샘플 폴더에 있는 레나 할머니의 리즈시절 사진을 띄워서 가우시안 스무딩 처리를 해주는 예제입니다.


int _tmain(int argc, _TCHAR* argv[])
{

    IplImage* src_img = cvLoadImage("C:\\OpenCV2.2\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if (src_img == NULL){
        return 0;
    }

    cvNamedWindow("src");
    cvNamedWindow("dst");

    IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);

    cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9);

    cvShowImage ("src", src_img);
    cvShowImage ("dst", dst_img);

    cvWaitKey (0);

    cvDestroyAllWindows();

    cvReleaseImage(&src_img);
    cvReleaseImage(&dst_img);


 return 0;
}

 

** 타이핑도 귀찮으므로 ( ㅋ _ㅋ);; 위의 코드를 첨부파일로 넣었습니다.  

 

결과>>

 

 

PART II-2 다른 설정 방법

 

OpenCVWiki에 있는 내용의 번역 수준이지만 적어두겠습니다.

 

1) [프로젝트 속성 페이지]->[VC++ 디렉터리]->[포함 디렉터리]에 다음을 추가합니다.

 

      C:\OpenCV2.2\include

      C:\OpenCV2.2\include\opencv

 

2) [프로젝트 속성 페이지]->[VC++ 디렉터리]->[라이브러리 디렉터리]에 다음을 추가합니다.

 

      C:\OpenCV2.2\lib

 

3) [프로젝트 속성 페이지]->[링커]->[입력]->[추가 종속성] 부분에 아래의 파일들을 입력합니다.

 

    - [구성]을 Debug에 놓고 아래를 입력합니다.

      C:\OpenCV2.2\lib\opencv_core220d.lib
      C:\OpenCV2.2\lib\opencv_highgui220d.lib
      C:\OpenCV2.2\lib\opencv_video220d.lib
      C:\OpenCV2.2\lib\opencv_ml220d.lib
      C:\OpenCV2.2\lib\opencv_legacy220d.lib
      C:\OpenCV2.2\lib\opencv_imgproc220d.lib

 

    - [구성]을 Release에 놓고 아래를 입력합니다.

      C:\OpenCV2.2\lib\opencv_core220.lib
      C:\OpenCV2.2\lib\opencv_highgui220.lib
      C:\OpenCV2.2\lib\opencv_video220.lib
      C:\OpenCV2.2\lib\opencv_ml220.lib
      C:\OpenCV2.2\lib\opencv_legacy220.lib
      C:\OpenCV2.2\lib\opencv_imgproc220.lib

 

 

 이렇게 하고 #include "stdafx.h"와 main 함수 사이의 내용을 아래로 바꾸면 동일한 결과를 얻을 수 있습니다.

 

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

출처 : http://blog.naver.com/hamstery?Redirect=Log&logNo=110102815307

이 댓글을 비밀 댓글로
    • 둔산동 프리덤
    • 2011.06.14 23:03
    꺅 전영호다~!
    • 둔산동 프리덤
    • 2011.06.14 23:03
    꺅 전영호다~!
    • 둔산동 베이베
    • 2012.03.11 01:32
    ㅋㅋㅋㅋ 영호 블로그다

[C/C++]유용한 #pragma directive

by Blogger 하얀쿠아
2011. 5. 21. 09:51 소프트웨어 Note/C++ MFC
출처 : http://eslife.tistory.com/187

※ 주의 : 아래에서 기술하는 내용은 Visual C++ 컴파일러에서만 확인된 내용입니다.


지난번 #define 팁 에 이어 이번에는 필수는 아니지만 사용할 경우 아주 편리한 #pragma 지시자를 간단하게 소개하려고 합니다.


1. 헤더 파일을 한번만 읽어 들이기


아마도 이 경우가 #pragma를 가장 널리 사용하게 된 이유 중에 하나라고 생각되는데요

저도 언제나 헤더 파일을 새로 코딩 할 때 이 한 줄을 먼저 적게 됩니다. (아주 짧고 멋집니다)

#pragma once

#pragma once 가 없을 당시에는 아래와 같이 헤더 파일 내용을 #ifndef ~  #endif 문장을 사용해서 복잡하게 써주어야 했습니다. (요 복잡한 게 한 줄로 줄었으니 사용하지 않을 수 없죠^^)

#ifndef _MY_HEADER_FILE_H_

#define _MY_HEADER_FILE_H_

// 실제헤더파일내용

 

#endif

하지만 이러한 방식은 헤더 파일마다 새로운 이름의 #define 문을 작성해야 했고 실수로 #endif 를 빼먹거나, #ifndef 과 짝을 잘못 이룬 경우 코딩과 상관없이 재앙을 불러오기 일쑤였습니다.

Visual Studio .NET 2003버전부터였던 것으로 기억되는데 프로젝트 위저드가 자동으로 만들어내는 헤더 파일에 #pragma once 가 들어 있어 그때부터 제가 만드는 헤더 파일도 이 방법을 애용하게 되었습니다.

 

2. Structure Alignment 조정하기


클라이언트 프로그램을 하다 보면 UNIX 나 기타 서버와 소켓연결을 통해 데이터를 주고 받는 경우가 많습니다. 서버와 통신을 하다 보면, 보통 UNIX 로부터 전송되는 구조체와 클라이언트 프로그램의 구조체의 Alignment를 맞춰주어야 하는 경우가 생깁니다.

#pragma 를 사용해서 구조체 Align 을 조정할 수 있다는 것을 몰랐던 시절에는 하는 수 없이 전체 프로젝트의 Align 속성을 ‘1’ 바이트로 변경하곤 했습니다.

사용자 삽입 이미지

이렇게 할 경우

-       Structure Alignment 를 기본인 8바이트로 사용할 경우보다 약간의 메모리 접근 성능이 저하되고

-       3’rd Party Library 와 구조체를 주고 받을 때 양쪽이 Alignment 가 틀려 고생할 가능성이 생기고

-       프로젝트를 신규 생성할 때마다 Alignment 값을 변경하지 않으면 이 역시 코딩과는 상관없이 서버로부터 받은 데이터가 몽땅 깨지는 현상을 만나는 문제가 있었습니다.

그래서 가급적이면 꼭 필요한 구조체에 대해서만(이 경우 서버와 통신하는 구조체) Structure Alignment 를 조정하는 것이 좋습니다.

#pragma pack 을 사용하면 특정 구조체만 간단하게 Alignment 속성을 바꿀 수 있습니다.

#pragma pack(push, 1)

struct ABC

{

           int BaseOption1;

           int BaseOption2;

           int BaseOption3;

           char szText[100];

           BYTE szAddress[100];

};

#pragma pack(pop)

#pragma pack 의 괄호 안에 들어가는 숫자 ‘1’ 1바이트로 Alignment 를 하라는 지시이고, #pragma pack(pop)은 이전 상태(디폴트가 8 바이트 Alignment 이면 8 바이트)로 돌아가라는 지시어입니다.

알고 보면 너무 간단한데 몇 년 동안 이 방법을 몰라 고생했더랬습니다.

 

3. 귀찮고 처치 곤란한 경고 메시지 없애기


좋은 프로그램을 작성하는 개발자라면 늘 Warning Level 을 최고로 올려 빌드 하실 텐데요

이 경우 의미 없는 경고도 어쩔 수 없이 많이 만나게 됩니다.

특히 .NET 2005 에서는 버그인지 모르겠지만, 주석문에 들어 있는 한글을 만나면 희한한 경고를 만나게 되는 경우가 많습니다.

warning C4819: The file contains a character that cannot be represented in the current code page (949). Save the file in Unicode format to prevent data loss

가능한 모든 경고는 없애야겠지만, 어쩔 수 없이 무시하고 넘겨야 하는 경고들도 있는데 이런 경고들은 다음 번 빌드부터는 보지 않도록 아래와 같이 지정할 수 있습니다.

#pragma warning (disable:4819)

위 내용은 4819 오류 경고 표시를 하지 말라는 뜻으로 쓰입니다. 이 경우도 push pop 을 사용해서 특정 소스에서만 경고가 안 나오게 설정할 수도 있습니다.

 

4. 라이브러리 링크하기

사용자 삽입 이미지

일반적으로 라이브러리를 링크하는 방법은 프로젝트 Linker 옵션에서 사용할 프로젝트 라이브러리를 지정해 주는 방식을 많이 사용합니다.

#pragma 를 사용하면, 프로그램 소스에서 직접 다른 라이브러리를 링크할 수 있습니다.

#pragma comment( lib, "../TEST_DLL/release/Testdll.Lib" )

이 방식은 프로젝트 속성창 > 링크옵션 > Testdll.lib 를 추가하는 것과 동일한 방식으로 라이브러리를 링크합니다.

프로젝트 속성을 통해 링크를 지정하는 방식과, #pragma 를 통해 링크를 지정하는 것 중 저희는 후자를 선호합니다.

후자와 같이 프로그램 소스에 링크 정보가 있을 경우 특정 모듈에 대한 종속정보를 단순히 소스 검색을 통해서 확인할 수 있고 프로젝트가 변경, 확장, 제거 될 때 마다 매번 프로젝트 속성을 재차 확인해야 하는 번거로움도 없어 자주 사용하게 되더군요

 

그외에도 MSDN에서 #pragma 를 찾아 보면 상당히 많은 지시자가 있는데 혹 공유할만한 내용 있으시면 많은 지적 바랍니다

Tags
이 댓글을 비밀 댓글로

레귤레이터에 캐패시터를 붙이는 이유(The reason why attach capacitor on regulator)

by Blogger 하얀쿠아
2011. 4. 18. 16:48 하드웨어 Note/Basis Circuit

레귤레이터에 캐패시터를 붙이는 이유 (The reason why attach capacitor on regulator)

통상적으로 데이터시트를 보다보면, 레귤레이터 앞과 뒷단에 캐패시터를 붙이는 걸 발견하게 된다.

이것들을 왜 붙일까? 크게 2가지 역할을 해준다. 

  1. 발진방지
  2. 전원임피던스를 낮추어줌 


첫번째 이유. 

레귤레이터는 일종의 DC앰프이다. 따라서 부하에 따라 자칫 발진할 가능성이 많다고 한다. 여기에 약간 이상한 부하, 예를 들면 모터나, 솔레노이드처럼 코일로 된 부하를 연결하면 쉽게 발진을 하게 된다고 한다. 실제 출력측에 콘덴서를 달지 않는 경우, 제조회사에 따라 다소 다르지만 수백khz정도로 발진을 하게된다. 그래서 발진방지용으로 콘덴서를 붙인다. 

이때 GND단자와 최대한 가깝게 연결하는 것이 중요한 포인트.


두번째 이유.

순간적인 부하전류변동에 대해 레귤레이터의 응답이 대응하지 못하는 경우가 있을수 있다. 즉 소비전류가 0.1A -> 1A로 급속히 변하는 경우 5V에서 약간 떨어졌다가 다시 5V로 복귀될 수 있다는 말이다. 

이런 경우 출력 측 콘덴서가 레귤레이터 대신 순간적인 출력을 내주므로써 어느정도 보상을 해주고, 회로를 안정적으로 유지해 주는 것이다. 

입력측에 콘덴서를 달아주는 것은 일반적인 레귤레이터의 경우 다음 조건을 만족해야 한다.


가령 5V 레귤레이터를 사용하기 위해서는 7V이상의 입력전압을 넣어줘야 하는데 여기서 7V란 의미는 리플전압에서 최소전압을 의미한다. 따라서 입력측에 콘덴서를 넣어주어 리플전압이나 노이즈를 제거함으로써 안정된 출력을 낼수 있게 해주는 것이다.

일반적으로 콘덴서 용량은 큰것이 좋지만 그렇다고 불필요하게 클 필요는 없다. 보통 수십~수백uF정도면 충분하다고 알려져있다.  위의 콘덴서 용량값은 최소조건이고, 되도록 이값보다 충분히 높은 용량을 붙이는 것이 더 좋긴 하다. 


캐패시터?

캐패시터는 축전기라고도 한다. 다른 말로 콘덴서라고 하는데 기본적으로 두개의 도체판을 나란하게 놓은 형태가 가장 기본 형태의 평행캐패시터 또는 평형 축전기라고 한다.     이러한  캐패시터에  직류 전압 V 를 가하면, 전하량 Q =CV 만큼의  전하가 축적된다. 즉 직류의 전압을 가하면  전하는 두 개의 도체판에 축적되기만 하지  전류는 흐르지 않는다. 즉 축적되는 동안은 전기는 흐르지만  전하들이 많아지면 전위가 나중에는 건전지와 같게 되어 더 이상 직류전지에서 전자는 나오지 않게 된다. 이렇게 도체판이 대전된 상태에서 회로가 끊어진 상태로 된다. 그래서 전기가 담아져 있다고 해서 축전기 즉 전기를 모은 상태라고 이야기 한다.

여기서 직류전압(전지)를 끊고 다른 회로를 연결하면 캐패시터에 모아진 전기 때문에 직류전지의 역활을 할수 있다. 

그러나  이것에 교류전압 v 를 가하면 캐패시터의 금속판에는 (+)와 (-)가 서로 번갈아 가면서 축적되거나 방출을 하게 된다. 즉 캐패시터는 충 ·방전되어, 이에 대해 교류의 경우는 C dv /dt 인 전류가 흐른다. 교류전압이 사인파 교류전압(각주파수 ω)이면, 콘덴서에 흐르는 전류는 그 크기가 1/ωC 의 리액턴스(캐패시터의 교류성분의 의한 저항) 저항에 흐르는 전류와 같고, 위상이 전압보다 90 ° 빠르다. 


 

 

 


이 댓글을 비밀 댓글로

[mysql] 암/복호화

by Blogger 하얀쿠아
2011. 4. 16. 03:25 소프트웨어 Note/데이터베이스

Oracle을 사용하던 사람들이 MySQL을 사용할 때 착각하기 쉬운 것 중 하나가
바로 DECODE 일 것이다.

내 블로그에 있는 http://blackbull.tistory.com/10
글을 보면, Oracle에서 사용하던 DECODE 에 대해 설명하고 있으니 그것은 별도로 참고하고,

오늘은 MySQL만을 살펴보도록 하자.

MySQL 툴이나, 기타 SQL관련 프로그램을 사용하다보면,
MySQL에서 DECODE의 글씨 색이 다른 것을 볼 수 있으며,
이미 예약어로 잡혀있는 것을 볼 수 있을 것이다.

즉, MySQL도 DECODE가 존재 한다는 것인데,
웃기게도 이것 때문에 Oracle의 DECODE와 혼동하는 사람들을 매번 낚고 있다 --;;


[MySQL에서 help를 이용하여 DECODE에 대해 알아본 결과]
************************************************************************************************
mysql> help decode
Name: 'DECODE'
Description:
Syntax:
DECODE(crypt_str,pass_str)

Decrypts the encrypted string crypt_str using pass_str as the password
crypt_str should be a string returned from ENCODE().

URL: http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html
************************************************************************************************

[DECODE, ENCODE 사용방법]
DECODE(암호화 할 대상 문자열, 암호화 용도로 사용되는 패스워드 키)
ENCODE(암호화 할 대상 문자열, 암호화 용도로 사용되는 패스워드 키)

[DECODE, ENCODE 설명]
MySQL에서의 DECODE는,
ENCODE 로 encryptioin 된 문자열을 역으로 바꿀 때 사용하는 함수이다.


바꿔 말하자면,
ENCODE 된 문자열이 존재해야 DECODE를 사용할 수 있다는 의미이다.

가령,
CREATE TABLE test (
  str blob
)ENGINE=INNODB DEFAULT CHARSET=UTF8;


이라고 테이블을 생성하고,
encryption된 값을 대입해 보자.

단, 여기서 주의할 점은 문자열이 encryption될 경우,
어떤 문자가 올지 모르기 때문에,
반드시 blob과 같은 binary형태의 자료형을 선언해 두어야 한다는 것이다.
만약 문자열이라고 char, varchar, text 등으로 자료형을 선언한다면,
warning 메세지를 받게 되며, 데이터가 입력되지 않게 된다.

아무튼,
INSERT test (str) VALUES (ENCODE('My Love Is Forever', 'Love'));
라고 입력 후

SELECT str FROM test;
해보자.

결과는?
*************************************************************************
jw
tj"R
*************************************************************************
라고 나온다.

즉, 'My Love Is Forever' 라는 문자열이, 특정한 알고리즘을 이용하여,
'Love' 라는 키워드를 이용하여 위의 결과와 같은 암호화된 결과를 만들어 낸 것이다.

그렇다면, 만약 이것을 정상적으로 보고자 한다면?

SELECT DECODE(str, 'Love') FROM test;
라고 해보자.

결과는?
*************************************************************************
My Love Is Forever
*************************************************************************
라고 나온다.


[결론]
자!!!
이것이 바로 MySQL의 DECODE인 것이다!!!!!!

그러니 앞으로 Oracle의 DECODE와 햇갈리는 사태를 벌이지 말도록 하자~


'소프트웨어 Note > 데이터베이스' 카테고리의 다른 글

[mysql] Data Type  (0) 2014.05.04
[mysql] 암/복호화  (0) 2011.04.16
이 댓글을 비밀 댓글로

OAuth 인증방식 이해하기

by Blogger 하얀쿠아
2011. 4. 16. 03:18 소프트웨어 Note/Algorithm

OAuth 인증방식 이해하기

본 문서는 OAuth의 이해를 돕기 위해 작성되었습니다.

OAuth 학습을 뛰어넘고 바로 예제 소스를 보며 개발을 하고 싶다면, 튜토리얼를 참고하시기 바랍니다.

본 문서 내의 용어 일관성을 위해 OAuth스팩에 있는 용어를 사용하였습니다. 본 문서에서 용어는 모두 이탤릭체로 표시됩니다.

용어정의

  • 서비스 프로바이더(Service Provider) – API를 제공하는 서비스를 말합니다. 예> 스프링노트
  • 사용자(users) - 서비스 프로바이더 혹은(그리고) 컨수머를 사용하는 이를 말합니다. 
  • 컨수머(Consumer) – API를 사용하여 개발된 애플리케이션 서비스를 말합니다. 예> 스프링노트의 API를 이용하여 개발된 매시업
  • 보호된 자원(Protected Resources): 서비스 프로바이더에 존재하는 사용자의 데이터를 의미합니다. 예> 스프링노트의 페이지 혹은 첨부 데이터들
  • 컨수머 개발자(Consumer Developer) : 컨수머를 개발하는 개인 혹은 단체
  • 컨수머 키(Consumer Key) : 서비스 프로바이더에게 컨수머 자신임을 인증하기 위한 키
  • 컨수머 시크릿(Consumer Secret) : 컨수머컨수머 키 소유권한이 있는지 인증하기 위한 키
  • 토큰(Tokens) – 컨수머에서 서비스 프로바이더에 있는 사용자보호된 자원에 접근하기 위해 사용되는 사용자의 인증정보입니다. 예를들어 스프링노트의 API를 사용해 개발된 매시업 M이 스프링노트(서비스 프로바이더)에 있는 사용자 U의  보호된 데이터에 접근하기 위해서는 사용자 U의 인증정보(credential)가 필요합니다. 그 인증정보를 위해 사용되는 것이 토큰입니다.

    • 리퀘스트 토큰(Request Token) :  컨수머사용자에게  접근권환을 획득하는 과정에서 사용하는 값이며, 이것은 차후 액세스 토큰으로 교환됩니다.
    • 리퀘스트 토큰 시크릿(Request Token Secret) :  리퀘스트토큰이 사용자의 것임을 인증하기 위한 값입니다.
    • 액세스 토큰(Access Token) : 컨수머사용자서비스 프로바이더를 통해서가 아닌 컨수머를 통해서 보호된 자원에 접근할 수 있는 권한을 받기 위한 값입니다.
    • 액세스 토큰 시크릿(Access Token Secret) : 액세스토큰사용자의 것임을 인증하기 위한 값입니다.

 

용어를 숙지 하셨다면, 이해를 쉽게 하기 위해 두 가지 관점에서 인증과정을 살펴보겠습니다.

사용자 관점에서 바라보았을 때의 인증과정을 학습하셨다면, 개발을 하기 위해 OAuth프로토콜 관점에서 바라보았을 때의 OAuth 인증과정을 통해 좀 더 자세히 OAuth인증 과정 학습 및 개발을 할 수 있습니다.

Tags
이 댓글을 비밀 댓글로

Travelling Salesman Problem Portal Site

by Blogger 하얀쿠아
2011. 4. 13. 15:36 소프트웨어 Note/Algorithm

최단경로로 모든 도시를 돌아다니는 경로/회로를 찾는 문제.

http://www.tsp.gatech.edu/
이 댓글을 비밀 댓글로

[안드로이드] 안드로이드 SDK 에뮬레이터에서 웹캠영상 받기

by Blogger 하얀쿠아
2011. 2. 3. 01:55 소프트웨어 Note/Android

안드로이드 SDK 에뮬레이터에서 웹캠영상 받기

안드로이드 의 에뮬에서는 직접적인 카메라 지원은 하지 않는다.
그래서 PC의 웹캠을 달고 영상을 에뮬에 전달해서 보여주는 방식을 사용하는데,
이걸 하는 방법은 다음과 같다.



카메라 영상을 Broadcasting하는 서버

일단은 android 개발 환경과 SDK는 다 설치 되었다는 가정하에 시작하자.


먼저 JMF가 필요한다.. 자바 에서 웹캠을 동작시켜 주는 프로그램이다.
현재는 거의 망해서 지원이 미비 하지만.. 어쨌건 우리는 이걸 사용해야 한다.

JMF는 여기서 받는다.

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html

받아서 설치 하고 난다음에
환경변수에서 classpath가 제대로 설정되어 있는지 확인 한다.


C:\Program Files\JMF2.1.1e\lib;C:\Program Files\Java\jdk1.6.0_21\lib;

위의 내용을 classpath에서 확인..

JMF 설치가 끝났으면, 캠영상을 보내는 역할로써 server가 필요한데, 이걸 구현해 놓은 사이트가 있다.


http://www.tomgibara.com/android/camera-source


여기 들어가서  CameraSource, SocketCamera, WebcamBroadcaster 소스를 받는다.
server 역할을 하는 소스는 WebcamBroadcaster이다.

이걸 프롬프트상에서 다음과 같이 실행하면 웹캠 동작 상태가 된다(웹캠이 동작한다는 표시가 들어옴.)

여기까지 했다면, webcam의 영상을 서버가 broadcasting 하고 있는것이다.


카메라 영상 수신 및 보여주는 클라이언트


이제 이 영상을 받아서 뿌려주는 부분을 구현 하면 되는데,
위에 받았던 CameraSource와 SocketCamera 소스를 이용한다.

CameraSource는 그대로 사용하고
SocketCamera 소스는 Line 77,78  에서 bitmap.getWidth(), bitmap.getHeight() 으로 수정해준다.

파일은 총 4개로 구성되어 있는데 다음과 같다.
1. CameraSource.java
2. Preview.java
3. SocketCamera.java
4. webcamactivity.java


Preview 소스는 다음과 같다.

preview.java 소스를 보면 웹캠 서버의 아이피 주소를 넣게 되어 있는데 
사용하는 본인 컴퓨터의 IP를 넣으면 된다.

SocketCamera cs= new SocketCamera("XXX.XXX.XXX.95", 9889, 320, 240,true); // XXX 부분에 본인 IP 넣도록 한다.

kage com.test.WebCam;

import android.content.Context;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


public class Preview extends SurfaceView implements SurfaceHolder.Callback, Runnable{
    private Thread thread = null; 
    SurfaceHolder mHolder;
    webcamactivity mCamera;
    Canvas canvas;
    SocketCamera cs= new SocketCamera("XXX.XXX.XXX.95", 9889, 320, 240,true);

    public Preview(Context context) {
        super(context);
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
    }

    public void run(){ 
        while (true) { 
            Canvas c = null; 
            try {
                c = mHolder.lockCanvas(null); 
                synchronized (mHolder){ 
                    cs.capture(c);
                    Thread.sleep(0);
                }//sync
            } catch (InterruptedException e){
                e.printStackTrace();
            } finally { 
                if (c != null) {
                    mHolder.unlockCanvasAndPost(c);
                } 
            }
        }//while() 
    }//run(){} 

public void surfaceCreated(SurfaceHolder holder) 
{          
    thread = new Thread(this); 
    thread.start(); 
}


public void surfaceDestroyed(SurfaceHolder holder)
{
    thread.stop();
}


public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{ 
    thread.stop();
}



webcamactivity 소스는 다음과 같다.


package com.test.WebCam;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class webcamactivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
           super.onCreate(savedInstanceState);
           requestWindowFeature(Window.FEATURE_NO_TITLE);
           setContentView(new Preview(this));
    }

}





이 댓글을 비밀 댓글로
    • 2013.03.23 20:19
    비밀댓글입니다
    • 2014.07.06 23:31
    비밀댓글입니다