2012/02/24

C#에서 OpenCV 사용하기 - OpenCVSharp

C#에서 OpenCV를 사용하기 위해 OpenCV wrapper for .Net Framework 가 필요하다.



OpenCvSharp-2.3.1-x86-20120218.zip



간단한 테스트에는 모든 파일이 필요 없고 OpenCvSharp.dll 만 이용해도 된다. 다른 여러 파일이 있지만 기본 기능은 
OpenCvSharp.dll 만 있으면 되는 것으로 보인다. 



Visual Studio 2010에서 Form Application을 만들고 Reference로 OpenCvSharp.dll 파일을 추가한다.



이제 Project에  간단한 OpenCV 코드를 작성한다.

아래 코드는 이미지를 불러들여 창으로 보여주는 아주 간단한 코드 이다.

private void btnLoadImage_Click(object sender, EventArgs e)
{
if (dlgOpen.ShowDialog() == DialogResult.OK)
{
IplImage iplImg = new IplImage(dlgOpen.FileName);

Cv.ShowImage("Image", iplImg);
}
}





그리고나서 컴파일을 하고 실행 파일이 있는 project/bin/Debug 경로에 Sample-2.3.1-20111229.zip 파일에 있는 dll 파일들을 복사해 두고 실행 테스트를 해 보았다.



하지만 실행시 OpenCV 관련 코드 실행시 에러가 발생하였다. 그래서 Visual C++ 2010 컴파일러로 직접 컴파일 한 dll 파일들 중 아래 세개 파일을 복사해 두었다. 




opencv_core231.dll


opencv_highgui231.dll

opencv_imgproc231.dll 



그 후로는 정상 동작을 하였다. 이제 C#으로 OpenCV를 활용한 프로그램을 만들어 봐야겠다.&

Original Post : http://neodreamer-dev.tistory.com/647

2012/02/23

Android 에뮬레이터에 가상 SD 카드 연결하기

Android 에뮬레이터를 만들때 SD Card 크기를 입력하는 부분이 있다.



이 부분에 크기를 입력하면 시스템의 User 폴더의 .android 폴더에 가상 머신 이름 폴더 안에 sdcard.img 파일로 생성이 된다. 시스템 폴더에 생성이 되는 것도 맘에 안들고 해서 다른 방법을 알아 보았다. 찾아보니 가상 SD Card 이미지를 만들고 파일을 연결하는 방법이 있었다.

 

우선 가상 SD Card 이미지를 만들어야 한다. Android SDK에 포함되어 있는 mksdcard.exe 프로그램으로 만들 수 있다. mksdcard.exe 는 SDK가 설치된 경로의 tools 폴더에 있다.



이 프로그램의 파라메터와 이미지 생성 방법은 아래와 같다.

D:\Dev\android_sdcard>..\android-sdk-windows    ools\mksdcard.exe
mksdcard: create a blank FAT32 image to be used with the Android emulator
usage: mksdcard [-l label]

if is a simple integer, it specifies a size in bytes
if is an integer followed by 'K', it specifies a size in KiB
if is an integer followed by 'M', it specifies a size in MiB
if is an integer followed by 'G', it specifies a size in GiB

Minimum size is 9M. The Android emulator cannot use smaller images.
Maximum size is 1099511627264 bytes, 1073741823K, 1048575M or 1023G

D:\Dev\android_sdcard>..\android-sdk-windows ools\mksdcard.exe 2G MyGB_SD.img

D:\Dev\android_sdcard>



이렇게 만들어진 파일을 Android 가상 머신 관리자에서 SD Card 부분에 입력을 해 주면 된다.



에뮬레이터에서 SD Card를 확인해 보았다.

<

Original Post : http://neodreamer-dev.tistory.com/646

2012/02/13

Android Platform 버전에 따른 API Level 버전

Android는 지금까지 다양한 Platform 버전을 공개하였다. 각각의 버전에 따라 API Level 번호가 부여 되었는데 이 번호는 안드로이드 프로젝트의 호환성을 위해 사용이 된다.



프로젝트에 지정된 API Level 보다 낮는 API Level 을 지원하는 Platform 에서는 해당 프로젝트를 실행할 수 없다.



아래 테이블은 Platform 버전에 따른 API Level 번호이다. 


















































































 Platform Version API Level VERSION_CODE
 Android 4.0.3 15 ICE_CREAM_SANDWICH_MR1
 Android 4.0, 4.0.1, 4.0.2 14 ICE_CREAM_SANDWICH
 Android 3.2 13 HONEYCOMB_MR2
 Android 3.1.x 12 HONEYCOMB_MR1
 Android 3.0.x 11 HONEYCOMB
 Android 2.3.4

 Android 2.3.3 
 10 GINGERBREAD_MR1
 Android 2.3.2

 Android 2.3.1

 Android 2.3 
 9 GINGERBREAD
 Android 2.2.x 8 FROYO
 Android 2.1.x 7 ECLAIR_MR1
 Android 2.0.1 6 ECLAIR_0_1
 Android 2.0 5 ECLAIR
 Android 1.6 4 DONUT
 Android 1.5 3 CUPCAKE
 Android 1.1 2 BASE_1_1
 Android 1.0 1 BASE

출처 : 
http://developer.android.com/guide/appendix/api-levels.html 


Eclipse 에 SDK 가 종류별로 설치가 되어 있다면 프로젝트의 속성에서 Android 카테고리에서 설치된 Platform 의 버전과 API Level 을 확인할 수 있다.









<

Original Post : http://neodreamer-dev.tistory.com/645

배포용 apk 만들기

프로그램 제작을 완료하고 단말기로 옮기기 위해 배포용 APK 파일을 만들어 보았다.

배포할 프로젝트를 선택하고 마우스 우측 버튼이나 메인 메뉴의 파일 메뉴에서 "Export" 메뉴를 선택한다.



Export 대화상자에서 Android 카테고리의 "Export Android Application"을 선택한다.



Export 하고자 하는 프로젝트를 다시 선택할 수 있다. 선택 되어진 프로젝트가 맞다면 다음 단계로 진행한다.



다음 단계는 Keystore 파일을 만드는 단계로 처음 배포의 경우 새롭게 Keystore 파일을 만들어 준다.

Keystore 파일 경로와 암호를 입력하고 다음 단계로 진행한다.



다음 단계는 Key Creation 과정으로 좀 더 상세한 정보를 작성한다.



마지막 단계로 출력하고자 하는 apk 파일 경로를 설정하고 마치면 해당 경로에 선택한 프로젝트의 apk 파일을 생성한다.

<

Original Post : http://neodreamer-dev.tistory.com/644

2012/02/12

[Android Dev] 시계 보기 프로그램 ReadWatch Final



간단한 이벤트 처리로 프로그램을 마무리 하였다.

시침과 분침의 하얀 원으로 바늘을 드래그 할 수 있고 디지탈 시계를 터치 함으로써 시각을 확인을 수 있는 기능이 전부다.



갤럭시 탭에 넣기 위기 기존 v2.3.3 (Version 10)을 v2.2(v8) 버전으로 만든 것이 전부 이다.



실제 갤럭시 탭에서 문제가 없었다.



<

Original Post : http://neodreamer-dev.tistory.com/643

apk 배포 문제...

ReadWatch를 다름 완성하였다.



그리고 에뮬레이터에서만 테스트 하던 것으로 아내의 갤럭시탭에서 테스트 하려고 했다.



갤럭시 탭 버전은 2.2 였다. 그래서 프로젝트를 기존 2.3.3 버전에서 2.2 버전으로 변경을하여 테스트 해 보았지만 갤럭시 탭에 apk가 설치되지 않았다.



우선 이 문제 부터 해결을 해야겠다. 


+) 2.2 의 버전의 버전 번호를 혼동해서 발생한 것이다. 2.2(v8)에서 실행에 문제가 없었다.&

Original Post : http://neodreamer-dev.tistory.com/642

[Android Tip] Asset Studio in ADT

간단한 Android 아이콘 작업을 찾았다. 예전에 글을 쓴 적이 있는 Android Asset Studio 를 찾았는데 이 웹사이트의 기능이 이미 Eclipse Plugin 에 포함이 되어 쉽게 사용할 수 있게 되었다.


Asset Studio 를 사용하려면 Eclipse 에서 Ctrl+N으로 새로 만들기 창을 호출한다.

New 대화상자에서 Android 카테고리의 Android Icon Set 을 선택한다.

 

Android Icon Set 을 선택하면 아이콘의 종류를 선택할 수 있다.



간단하게 Launcher Icon 을 바꾸어 보았다.



아이콘을 만들고 종료(Finish)하면 기존의 파일이 존재하는 경우 덮어 쓸 것인지 묻는 메시지 창이 나온다. 모두 덮어 쓰면 모두 5개의 파일을 새롭게 저장한다.



실행을 해서 프로그램 목록을 모면 바뀐 아이콘을 확인할 수 있다.



아이콘의 종류에 따라 약간씩 다른 UI를 제공하고 있다.












2012/02/10

[Android Dev] 시계 보기 프로그램 ReadWatch #3



시계 색상을 바꾸어 보았다.

바늘을 이동하는 기능도 구현하였고 아마 다음 포스팅이 마지막이 될 것 같다.&

Original Post : http://neodreamer-dev.tistory.com/640

2012/02/08

[Android Dev] 시계 보기 프로그램 ReadWatch #2

하루하루 짧은 시간이라도 공부하며 개발을 진행하고 있다.

이제 전체 UI를 잡아 놓았다.


 

자세한 색상이나 기능은 아직 구현하지 않았지만 그리 복잡하지 않아 곧 완성할 수 있을 것 같다.

다 완성을 한 후 아이들에게 시계를 읽는 방법을 가르쳐 봐야 겠다.&

Original Post : http://neodreamer-dev.tistory.com/639

2012/02/07

View.onTouchEvent() Eclipse Template 문제

Android의 View에서 Touch 이벤트 사용에 대한 공부를 하고 있던 중 이상한 점을 발견하였다.



테스트한 내용은 너문 단순한 코드 였다. 안드로이드의 기본 아이콘을 마우스를 드래그하는 동안 따라다니며 그리도록 한 소스이다.

    
private float mPosX = 0;
private float mPosY = 0;
private boolean mMove = false;
private Bitmap mBitmap = null;

public CanvasView( Context context )
{
super( context );

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}

protected void onDraw( Canvas canvas )
{
Paint paint = new Paint();
canvas.drawBitmap( mBitmap, mPosX, mPosY, paint );

super.onDraw( canvas );
}

@Override
public boolean onTouchEvent( MotionEvent event )
{
if ( event.getAction() == MotionEvent.ACTION_DOWN )
{
Log.i( "onTouchEvent", "ACTION_DOWN ("+event.getX()+","+event.getY()+")");
mMove = true;
}
else if ( event.getAction() == MotionEvent.ACTION_MOVE )
{
Log.i( "onTouchEvent", "ACTION_MOVE ("+event.getX()+","+event.getY()+")");
if ( mMove )
{
mPosX = event.getX();
mPosY = event.getY();

invalidate();
}
}
else if ( event.getAction() == MotionEvent.ACTION_UP )
{
Log.i( "onTouchEvent", "ACTION_UP ("+event.getX()+","+event.getY()+")");
mMove = false;
}

return super.onTouchEvent( event );
}





이 소스를 실행하여 기본 아이콘이 뷰에서 마우스를 드래그 하면 드래그하는 위치에 그려 줄 것으로 기대하였다. 하지만 아이콘은 미동도 하지 않았다. 추적을 위해 각 event 에 대하여 Log를 출력해 보니 ACTION_DOWN에 대한 이벤트만 발생을 하고 다른 이벤트는 발생하지 않았다. 코드상 문제가 없는 것 같은데 동작을 하지 않는다. 



해결책을 찾으려 우선 안드로이드 개발자 사이트를 찾아 갔다. 개발자 사이트에서 View.onTouchEvent에 대한 짧막한 설명이 나와 있었다.




public boolean onTouchEvent (MotionEvent event) Since: API Level 1


Implement this method to handle touch screen motion events.


Parameters


event The motion event.

Returns


True if the event was handled, false otherwise.





설명에도 크게 주목할 만한 사항이 보이지 않았다. 마지막 Returns 부분에 반환값이 true 이면 이벤트가 처리되고 false 이면 아니라는 말이 걸렸다.



그래서 위의 코드 중 마지막 부분에 대한 결과값을 확인해 보았다.

    
boolean bSuper = super.onTouchEvent( event );
Log.i("onTouchEvent", "Call super.onTouchEvent( event ) => " + bSuper );

결과
onTouchEvent(543): Call super.onTouchEvent( event ) => false






결과는 false를 반환하고 있었다.

eclipse 가 만들어준 코드인데 왜그러지? onTouchEvent 함수의 마지막 부분을 return super.onTouchEvent( event ); 에서 return true;로 변경하니 원하던 동작이 이루어 졌다.



Eclipse 에서 만들어준 코드를 무작정 믿기만 하면 안되겠다. 자동으로 만들어 준 코드라 해도 알고 써야 겠다.

&

Original Post : http://neodreamer-dev.tistory.com/638

2012/02/06

Visual C++ 2005 와 SQLite 3.7.10

SQLite 가 공개가 되면 프로젝트에 사용적용하기 위해 64비트용 dll과 static 라이브러리를 만들었다.

그런데 이번 3.7.10 버전은 Visual C++ 2005 버전에서 컴파일은 문제 없으나 데이터베이스 생성시 런타임 에러가 발생하였다. Visual C++ 2010 버전에서는 문제가 발생하지 않았다.

amalgamation 을 이용하여 SQLite를 프로젝트에 포함을 시켜도 증상은 동일하였다.



관련 정보를 찾아보다가 그 원인과 해결책을 찾았다.

참고가 된 정보는 
http://www.sqlite.org/src/info/1ce4d21d52  이다. 

Visual C++ 2005 버전에서는 _WIN32_WINNT 가 기본적으로 정의가 되지 않아 sqlite3.c 컴파일 때 Window로 인식하하지 않아 런타임 에러가 발생하는 것이였다.



해결책은 sqlite3.c 파일을 수정하면 된다.

수정해야할 내용은 문제의 정보가 있는
http://www.sqlite.org/src/info/1ce4d21d52 있는 방법대로


#if defined(_WIN32_WINNT)


# define SQLITE_OS_WINNT 1


#else


# define SQLITE_OS_WINNT 0

#endif



부분을 아래 내용을 바꾸면 된다. 


#if SQLITE_OS_WIN && !defined(SQLITE_OS_WINNT)


# define SQLITE_OS_WINNT 1

#endif 



더 간단한 방법은 sqlite3.c 가장 윗줄에 _WIN32_WINNT 을 define 해주면 된다.

#define _WIN32_WINNT 0x0500 &

Original Post : http://neodreamer-dev.tistory.com/637

2012/02/05

Visual C++ 프로젝트에 SQLite 포함시키기

SQLite 는 32비트 Dll 형태로 기본 배포가 되고 있다.

하지만 프로젝트를 진행함에 있어 다양한 환경에 접하게 된다. 요즘은 64비트 프로젝트로 일반화 되어 있어 32비트 Dll 만드로는 부족한 것이 많다.



이전에는 64비트 프로젝트에서 사용하기 위해 별도의 Dll 이나 Static Library 만들어 사용 하였다.

하지만 굳이 그렇게 별도의 라이브러리를 만들지 않아도 쉽게 프로젝트에 SQLite 를 포함 시킬 수 있다.



SQLite 사이트에서 배포하는 amalgamation 소스를 이용하면 된다.

프로젝트에 원하는 SQLite 버전의 amalgamation 소스를 추가 한다. 추가되는 파일은 아래 4개 파일 이다.


shell.c


sqlite3.c


sqlite3.h


sqlite3ext.h



이 파일들 중에서 sqlite3.c 와 sqlite3.h 파일을 이용하게 된다.

프로젝트를 컴파일 하면 아래와 같은 에러 메시지를 만나게 된다.

Error 1 error C1853: 'x64\Debug\xxx.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)


sqlite3.c 파일이 C로 작성이 되어 Precompiled Header 를 지원하지 않는다. 따라서 Precompiled Header를 사용하지 않도록 해야 하는데 프로젝트 전반적으로 설정할 경우 컴파일 속도에 많은 문제가 되므로 sqlite3.c 파일만 Precompiled Header를 사용하지 않도록 설정한다.

방법은 Solution Explorer 에서 sqlite3.c 파일을 선택하고 속성창을 실행해서 Precompiled Header를 사용하지 않음으로 설정하고 컴파일 하면 된다.

 &

Original Post : http://neodreamer-dev.tistory.com/636