|
구분 |
기능 |
특징 |
Application |
안드로이드 응용프로그램 |
스마트폰 카메라를 이용한 얼굴인식 및 검GPS를 이용하여 길 저장 추가 소셜 네트워크 서비스 |
n Architecture
n Flow
n 개발내용 및 결과
-핵심엔진
(1) FaceDetect 엔진
개요
OpenCV의 AdaBoost를 이용한 얼굴과 눈, 코, 입을 검출하는 엔진이다.
AdaBoost는 데이터가 학습데이터와 같은 Class로 분류되는지를 분류해 내는 분류기로 다수의 약한 분류기(각 약한 분류기는 의사 결정 트리로 돼있다)를 결합해 강한 분류기를 생성해내는 것이 핵심인 알고리즘으로 높은 분류율을 보인다. OpenCV에서 제공해 주는 AdaBoost 학습기를 이용하면 쉽게 학습데이터를 만들어 사용 할 수 있다.
Haarcascade 예제들 중에 얼굴, 눈, 코, 입에 대한 학습데이터가 이미 존재하는 것을 발견하고 그것을 이용하여 각 개체를 분류해 낸다.
다음의 파일들이 각각 얼굴, 왼쪽 눈, 입, 코, 오른쪽 눈에 대한 학습 데이터 들이다.
haarcascade_frontalface_alt.xml
haarcascade_mcs_lefteye.xml
haarcascade_mcs_mouth.xml
haarcascade_mcs_nose.xml
haarcascade_mcs_righteye.xml
FaceDetect 엔진 사용
FaceDetect.h
FaceDetect.lib
FaceDetect.dll
cv200.dll
cxcore200.dll
cv200.lib
cxcore200.lib
haarcascade_frontalface_alt.xml
haarcascade_mcs_lefteye.xml
haarcascade_mcs_mouth.xml
haarcascade_mcs_nose.xml
haarcascade_mcs_righteye.xml
위의 파일들이 배포되는데 프로젝트에 복사하고 cv200.lib cxcore200.lib FaceDetect.lib 등의 라이브러리를 링크하여 사용하면 된다.
자료구조 설명
FaceElementsDetecting 함수를 통해 검출된 안면 정보는
extern "C" FACEDETECT_DLL_TYPE typedef struct FaceInfo
{
CvRect* face; //얼굴
CvRect* nose; //코
CvRect* leftEye; //왼쪽눈
CvRect* rightEye; //오른쪽눈
CvRect* mouth; //입
}FaceInfo;
위의 구조체에 담겨저 반환 되는데 각 요소의 사각 영역은 다음과 같다.
X, Y는 이미지에서의 픽셀좌표이며 Heigth와 Width는 사각영역의 높이와 가로길이다.
Interface
#ifdef DLLEXPORT_FACEDETECT_SUNMOONBIT_20_TH
#define FACEDETECT_DLL_TYPE __declspec(dllexport)
#else
#define FACEDETECT_DLL_TYPE __declspec(dllimport)
#endif
#include "cv.h"
/*------------------------------------------------------------------------------
*
* 파일명: FaceDetect.h
*
* 작성자: 유승재
* 작성일: 2010.10.28
* 목 적: 이미지 상의 얼굴, 눈, 코, 입검출
*
------------------------------------------------------------------------------*/
/********************************************************************************
* 검출된얼굴, 눈, 코, 입에대한사각영역을저장한다.
*
* (값이null 해당 요소는 검출실패한것이다.)
********************************************************************************/
extern "C" FACEDETECT_DLL_TYPE typedef struct FaceInfo
{
CvRect* face; //얼굴
CvRect* nose; //코
CvRect* leftEye; //왼쪽눈
CvRect* rightEye; //오른쪽눈
CvRect* mouth; //입
}FaceInfo;
/********************************************************************************
* 얼굴, 코, 눈, 입에대한학습데이터를로드한다.
*
* (모든메소드를이용하기전에반드시한번호출해주어야한다.)
********************************************************************************/
extern "C" FACEDETECT_DLL_TYPE void InitFaceDetecting();
/********************************************************************************
* 로드한학습데이터를해제한다.
*
* (InitFaceDetecting()을호출했다면반드시호출해주어야한다.)
********************************************************************************/
extern "C" FACEDETECT_DLL_TYPE void EndFaceDetecting();
/********************************************************************************
* 얼굴의각요소들을검출해낸다.
*
* image : 얼굴을검출할이미지
********************************************************************************/
extern "C" FACEDETECT_DLL_TYPE FaceInfo* FaceElementsDetecting( IplImage* image );
/********************************************************************************
* FaceElementsDetecting 함수로부터반환받은메모리를해제시킨다.
*
* (반환받은구조체의사용이끝나면반드시호출해주어야한다.)
********************************************************************************/
extern "C" FACEDETECT_DLL_TYPE void ReleaseFaceInfo( FaceInfo** faceInfo );
Code
#define DLLEXPORT_FACEDETECT_SUNMOONBIT_20_TH
#include "FaceDetect.h"
/********************************************************************************
* 함수선언
********************************************************************************/
void FaceDetecting( IplImage* image, FaceInfo* faceInfo ); //얼굴을검출한다.
void NoseDetecting( IplImage* image, FaceInfo* faceInfo ); //코를검출한다.
void MouthDetecting( IplImage* image, FaceInfo* faceInfo ); //입을검출한다.
void LeftEyeDetecting( IplImage* image, FaceInfo* faceInfo ); //왼쪽눈을검출한다.
void RightEyeDetecting( IplImage* image, FaceInfo* faceInfo ); //오른쪽눈을검출한다.
/********************************************************************************
* 전역변수
********************************************************************************/
CvHaarClassifierCascade *faseCascade; //얼굴에대한학습데이터
CvHaarClassifierCascade *noseCascade; //코에대한학습데이터
CvHaarClassifierCascade *leftEyeCascade; //왼쪽눈에대한학습데이터
CvHaarClassifierCascade *rightEyeCascade; //오른쪽눈에대한학습데이터
CvHaarClassifierCascade *mouthCascade; //입에대한학습데이터
CvMemStorage *storage; //검출된영역을임시로저장할메모리
/********************************************************************************
* 함수구현
********************************************************************************/
/////////////////얼굴, 코, 눈, 입에대한학습데이터를로드한다.//////////////////
extern "C" FACEDETECT_DLL_TYPE void InitFaceDetecting()
{
faseCascade = (CvHaarClassifierCascade *) cvLoad("haarcascade_frontalface_alt.xml", 0, 0, 0);
noseCascade = (CvHaarClassifierCascade *) cvLoad("haarcascade_mcs_nose.xml", 0, 0, 0);
leftEyeCascade = (CvHaarClassifierCascade *) cvLoad("haarcascade_mcs_lefteye.xml", 0, 0, 0);
rightEyeCascade = (CvHaarClassifierCascade *) cvLoad("haarcascade_mcs_righteye.xml", 0, 0, 0);
mouthCascade = (CvHaarClassifierCascade *) cvLoad("haarcascade_mcs_mouth.xml", 0, 0, 0);
storage = cvCreateMemStorage(0);
}
//////////////////////////로드한학습데이터를해제한다.//////////////////////////
extern "C" FACEDETECT_DLL_TYPE void EndFaceDetecting()
{
cvReleaseHaarClassifierCascade( &mouthCascade );
cvReleaseHaarClassifierCascade( &rightEyeCascade );
cvReleaseHaarClassifierCascade( &leftEyeCascade );
cvReleaseHaarClassifierCascade( &noseCascade );
cvReleaseHaarClassifierCascade( &faseCascade );
cvReleaseMemStorage( &storage );
}
////////////////////////얼굴의각요소들을검출해낸다./////////////////////////
extern "C" FACEDETECT_DLL_TYPE FaceInfo* FaceElementsDetecting( IplImage* image )
{
FaceInfo* faceInfo = new FaceInfo;
memset( faceInfo, 0, sizeof(FaceInfo) );
FaceDetecting( image, faceInfo );
if( faceInfo->face != 0 )
{
NoseDetecting( image, faceInfo );
MouthDetecting( image, faceInfo );
LeftEyeDetecting( image, faceInfo );
RightEyeDetecting( image, faceInfo );
}
return faceInfo;
}
///////////////////////////////얼굴을검출한다./////////////////////////////////
void FaceDetecting( IplImage* image, FaceInfo* faceInfo )
{
//얼굴검출
CvSeq* tempSeq = cvHaarDetectObjects( image, faseCascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0) );
//얼굴의사각영역을구함.
CvRect* tempRect = (CvRect*)cvGetSeqElem(tempSeq, 0);
if( tempRect != 0 )
{
faceInfo->face = new CvRect;
*faceInfo->face = *tempRect;
}
}
//////////////////////////////코를검출한다.///////////////////////////////////
void NoseDetecting( IplImage* image, FaceInfo* faceInfo )
{
//관심영역지정
CvRect roiFace = { faceInfo->face->x, faceInfo->face->y + faceInfo->face->height/4 * 2,
faceInfo->face->width, faceInfo->face->height/4 * 2};
cvSetImageROI( image, roiFace );
//관심영역내에서코를검출
CvSeq* tempSeq = cvHaarDetectObjects( image, noseCascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0) );
//코의사각영역을구함.
CvRect* tempRect = (CvRect*)cvGetSeqElem(tempSeq, 0);
if( tempRect != 0 )
{
faceInfo->nose = new CvRect;
tempRect->x += faceInfo->face->x;
tempRect->y += faceInfo->face->y + faceInfo->face->height/4 * 2;
*faceInfo->nose = *tempRect;
}
cvResetImageROI(image);
}
///////////////////////////////입을검출한다.//////////////////////////////////
void MouthDetecting( IplImage* image, FaceInfo* faceInfo )
{
//관심영역지정
CvRect roiFace = { faceInfo->face->x, faceInfo->face->y + ( faceInfo->face->height/12 ) * 9,
faceInfo->face->width, faceInfo->face->height/12 * 3 };
cvSetImageROI( image, roiFace );
//관심영역내에서입을검출
CvSeq* tempSeq = cvHaarDetectObjects( image, mouthCascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0) );
//입의사각영역을구함.
CvRect* tempRect = (CvRect*)cvGetSeqElem(tempSeq, 0);
if( tempRect != 0 )
{
faceInfo->mouth = new CvRect;
tempRect->x += faceInfo->face->x;
tempRect->y += faceInfo->face->y + ( faceInfo->face->height/12 ) * 9;
*faceInfo->mouth = *tempRect;
}
cvResetImageROI(image);
}
//////////////////////////////왼쪽눈을검출한다.//////////////////////////////
void LeftEyeDetecting( IplImage* image, FaceInfo* faceInfo )
{
//관심영역지정
CvRect roiFace = { faceInfo->face->x, faceInfo->face->y + ( faceInfo->face->height/4 ) ,
faceInfo->face->width / 2, faceInfo->face->height/4 };
cvSetImageROI( image, roiFace );
//관심영역내에서왼쪽눈을검
CvSeq* tempSeq = cvHaarDetectObjects( image, leftEyeCascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0) );
//왼쪽눈의사각영역을구함
CvRect* tempRect = (CvRect*)cvGetSeqElem(tempSeq, 0);
if( tempRect != 0 )
{
faceInfo->leftEye = new CvRect;
tempRect->x += faceInfo->face->x;
tempRect->y += faceInfo->face->y + ( faceInfo->face->height/4 );
*faceInfo->leftEye = *tempRect;
}
cvResetImageROI(image);
}
///////////////////////////////오른쪽눈을검출한다/////////////////////////////
void RightEyeDetecting( IplImage* image, FaceInfo* faceInfo )
{
//관심영역지정
CvRect roiFace = { faceInfo->face->x + faceInfo->face->width/2,
faceInfo->face->y + ( faceInfo->face->height/4 ) , faceInfo->face->width/2, faceInfo->face->height/4 };
cvSetImageROI( image, roiFace );
//관심영역내에서오른쪽눈을검출
CvSeq* tempSeq = cvHaarDetectObjects( image, rightEyeCascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0) );
//오른쪽눈의사각영역을구함
CvRect* tempRect = (CvRect*)cvGetSeqElem(tempSeq, 0);
if( tempRect != 0 )
{
faceInfo->rightEye = new CvRect;
tempRect->x += faceInfo->face->x + faceInfo->face->width/2;
tempRect->y += faceInfo->face->y + ( faceInfo->face->height/4 );
*faceInfo->rightEye = *tempRect;
}
cvResetImageROI(image);
}
/////////FaceElementsDetecting 함수로부터반환받은메모리를해제시킨다./////////
extern "C" FACEDETECT_DLL_TYPE void ReleaseFaceInfo( FaceInfo** faceInfo )
{
delete (*faceInfo)->face;
delete (*faceInfo)->leftEye;
delete (*faceInfo)->mouth;
delete (*faceInfo)->nose;
delete (*faceInfo)->rightEye;
delete *faceInfo;
}
예제 소스
#include "cv.h"
#include "highgui.h"
#include "FaceDetect.h"
//이미지에사각영역을그린다.
void RectDrow( IplImage* image, const CvRect* rect )
{
CvPoint pt1 = { rect->x, rect->y };
CvPoint pt2 = {(rect->x + rect->width), (rect->y + rect->height)};
cvRectangle(image, pt1, pt2, CV_RGB(255, 0, 0), 2, 8, 0);
}
void main()
{
cvNamedWindow( "FaceDetect", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCaptureFromCAM(0); //카메라로부터영상을캡쳐한다.
IplImage* frame;
char c;
//얼굴인식시작
InitFaceDetecting();
FaceInfo* faceInfo;
while(true)
{
cvGrabFrame( capture ); //카메라로부터
frame = cvRetrieveFrame(capture); //프레임이미지를받는다.
faceInfo = FaceElementsDetecting( frame ); //얼굴요소를검출한다.
//얼굴, 눈, 코, 입이 모두 검출됐다면
if(faceInfo->face != 0 && faceInfo->leftEye != 0 && faceInfo->mouth != 0 && faceInfo->nose != 0 && faceInfo->rightEye != 0)
{
RectDrow( frame, faceInfo->face ); //얼굴을그린다.
RectDrow( frame, faceInfo->nose ); //코를그린다.
RectDrow( frame, faceInfo->mouth ); //입을그린다.
RectDrow( frame, faceInfo->leftEye ); //왼쪽눈을그린다.
RectDrow( frame, faceInfo->rightEye ); //오른쪽눈을그린다.
}
//프레임을윈도우에출력한다.
cvShowImage("FaceDetect", frame);
c = cvWaitKey(33);
if(c == 27) //ESC를누르면종료한다.
{
break;
}
ReleaseFaceInfo( &faceInfo );
}
//얼굴인식종료
EndFaceDetecting();
cvReleaseCapture( &capture );
cvDestroyWindow( "FaceDetect" );
}
(2)GPS를 이용한 코스저장
. 코스저장
설명
사용자가 입력한 코스를 맵에 표시하고 db에 저장한다. |
Ruote Class
public class Ruote extends MapActivity implements LocationListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
_edEnter = (EditText) findViewById(R.id.edEnter); _btStart = (Button) findViewById(R.id.btStart); _btStop = (Button) findViewById(R.id.btStop); _btEnter = (Button) findViewById(R.id.btEnter); _btSave = (Button) findViewById(R.id.btSave);
_btStart.set[안내]태그제한으로등록되지않습니다-xxOnClickListener(on_Start); _btStop.set[안내]태그제한으로등록되지않습니다-xxOnClickListener(on_Stop); _btEnter.set[안내]태그제한으로등록되지않습니다-xxOnClickListener(on_Enter); _btSave.set[안내]태그제한으로등록되지않습니다-xxOnClickListener(on_Save);
_LatiList = new ArrayList<Double>(); _LongList = new ArrayList<Double>(); _ContentList = new ArrayList<String>();
_Location = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria _Criteria = new Criteria();
_Criteria.setAccuracy(Criteria.ACCURACY_FINE); _Criteria.setPowerRequirement(Criteria.POWER_HIGH);
String _BestProvider = _Location.getBestProvider(_Criteria, true);
_Location.requestLocationUpdates(_BestProvider, 1000, 0, this);
mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true);
mapView.setSatellite(false); mc = mapView.getController();
mc.setZoom(17); }
private LocationManager _Location = null;
MapView mapView = null; MapController mc = null;
MyOverlay mo = null; private List<Overlay> moList = null;
private Button _btStart = null; private Button _btStop = null; private Button _btSave = null; private Button _btEnter = null; private EditText _edEnter = null;
private double _Latitude = 0; private double _Longitude = 0;
private ArrayList<Double> _LatiList = null; private ArrayList<Double> _LongList = null; private ArrayList<String> _ContentList = null;
int _Lati = 0; int _Long = 0;
boolean save = false;
private View.[안내]태그제한으로등록되지않습니다-xxOnClickListener on_Start = new View.[안내]태그제한으로등록되지않습니다-xxOnClickListener() { public void [안내]태그제한으로등록되지않습니다-xxonClick(View v) { if(_Lati == 0 || _Long == 0) { return; }
_LatiList.clear(); _LongList.clear(); _ContentList.clear();
moList = mapView.getOverlays(); moList.clear();
save = true; mo = new MyOverlay(); mo.Append(_Lati, _Long, 1);
GeoPoint geoPoint = new GeoPoint(_Lati, _Long); mc.animateTo(geoPoint); mo.App_exp("출발지");
mapView.getOverlays().add(mo);
_LatiList.add(_Latitude); _LongList.add(_Longitude); _ContentList.add("출발지");
} };
private View.[안내]태그제한으로등록되지않습니다-xxOnClickListener on_Stop = new View.[안내]태그제한으로등록되지않습니다-xxOnClickListener() { public void [안내]태그제한으로등록되지않습니다-xxonClick(View v) { if (save == false) { return; }
save = false; mo = new MyOverlay(); mo.Append(_Lati, _Long, 1);
GeoPoint geoPoint = new GeoPoint(_Lati, _Long); mc.animateTo(geoPoint); mo.App_exp("도착지");
mapView.getOverlays().add(mo);
_LatiList.add(_Latitude); _LongList.add(_Longitude); _ContentList.add("도착지"); } };
private View.[안내]태그제한으로등록되지않습니다-xxOnClickListener on_Enter = new View.[안내]태그제한으로등록되지않습니다-xxOnClickListener() { public void [안내]태그제한으로등록되지않습니다-xxonClick(View v) { if(_btEnter.getText().toString() == "") { return; }
GeoPoint geoPoint = new GeoPoint(_Lati, _Long); mo = new MyOverlay(); mo.Append(_Lati, _Long, 0); mo.App_exp(_btEnter.getText().toString()); mc.animateTo(geoPoint);
mapView.getOverlays().add(mo);
_ContentList.add(_btEnter.getText().toString()); _btEnter.setText(""); } };
private View.[안내]태그제한으로등록되지않습니다-xxOnClickListener on_Save = new View.[안내]태그제한으로등록되지않습니다-xxOnClickListener() { public void [안내]태그제한으로등록되지않습니다-xxonClick(View v) { if(_LatiList.isEmpty() || !save) { return; }
CooInsert ci = new CooInsert();
ci.Send(_LatiList, _LongList, _ContentList);
} };
@Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; }
@Override public void onLocati[안내]태그제한으로등록되지않습니다-xxonChanged(Location location) {
_Latitude = location.getLatitude(); _Longitude = location.getLongitude();
_Lati = (int)(_Latitude * 1000000); _Long = (int)(_Longitude * 1000000);
GeoPoint geoPoint = new GeoPoint(_Lati, _Long);
if(save) { mo = new MyOverlay(); mo.Append(_Lati, _Long, 0); mc.animateTo(geoPoint);
mapView.getOverlays().add(mo);
_LatiList.add(_Latitude); _LongList.add(_Longitude); _ContentList.add(" "); } }
} |
Ruote Class는 gps에서 좌표를 받아오고 구글맵을 이용하여 지도을 보여주며 버튼에 대한 이벤트를 처리하는 클레스이다. |
MyOverlay Class
public class MyOverlay extends Overlay {
@Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow);
Paint paint1 = new Paint(); Paint paint2 = new Paint();
paint1.setARGB(255, 255, 0, 0); paint2.setARGB(255, 0, 255, 0);
GeoPoint geoPoint = new GeoPoint(lat,lon);
Point pixPoint = new Point();
mapView.getProjection().toPixels(geoPoint, pixPoint); // 지리좌표를 화면상의 픽셀좌표로 변환
if (_point == 1) { canvas.drawCircle(pixPoint.x, pixPoint.y, 9, paint1); } else { canvas.drawCircle(pixPoint.x, pixPoint.y, 7, paint2); }
if(_exp != null) { canvas.drawText(_exp.toString(), pixPoint.x-12, pixPoint.y + 23, paint1); } }
public void Append(int _lat, int _lon, int p) {
lat = _lat; lon = _lon; _point = p; }
public void App_exp (String string) { _exp = string; }
private int lat = 0; private int lon = 0; private int _point = 0; private String _exp = null; }
|
MyOverlay는 ItemizedOverlay를 상속받은 객체로 지도 위에 마커를 표시하고 하고 간단한 정보를 표시하는 역할을한다. |
CooInsert Class
public class CooInsert {
private static final String SOAP_ACTION = "http://tempuri.org/InsertCoor"; private static final String METHOD_NAME = "InsertCoor "; private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "http://192.168.34.57/GroupProjectWebService/Service.asmx";
public void Send(ArrayList<Double> _LatiList, ArrayList<Double> _LongList, ArrayList<String> _ContentList) {
int size = _LongList.size();
String header = "INSET_COOR"; String msg = String.format(header + '/' + size + '/');
for(int i = 0 ; i < size ; i++) { msg = String.format (msg + _LatiList.get(i).toString() + '/'); }
for(int i = 0 ; i < size ; i++) { msg = String.format (msg + _LongList.get(i).toString() + '/'); }
for(int i = 0 ; i < size ; i++) { msg = String.format (msg + _ContentList.get(i) + '/'); }
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); Request.addProperty("PACK", msg);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = true; soapEnvelope.setOutputSoapObject(Request);
AndroidHttpTransport aht = new AndroidHttpTransport(URL);
try { aht.call(SOAP_ACTION, soapEnvelope); SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse(); } catch (Exception e) { e.printStackTrace();
}
}
} |
CooInsert 클래스는 웹서비스를 이용하여 코스의 좌표데이터를 db에 저장하는 역활을 한다. |
코스 불러오기
설명
DB에 저장된 코스를 일어와서 맵에 보여준다.. |
CooRecive Class
public class CooRecive {
private static final String SOAP_ACTION = "http://tempuri.org/InsertCoor"; private static final String METHOD_NAME = "InsertCoor "; private static final String NAMESPACE = "http://tempuri.org/"; private static final String URL = "http://192.168.34.57/GroupProjectWebService/Service.asmx";
ArrayList<Double> _LatiList = null; ArrayList<Double> _LongList = null; ArrayList<String> _ContentList = null;
int size = 0;
public CooRecive(int Route_num) {
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); Request.addProperty("Route_num", Route_num);
soapEnvelope.dotNet = true; soapEnvelope.setOutputSoapObject(Request);
AndroidHttpTransport aht = new AndroidHttpTransport(URL);
try { aht.call(SOAP_ACTION, soapEnvelope); SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
_LatiList = new ArrayList<Double>(); _LongList = new ArrayList<Double>(); _ContentList = new ArrayList<String>();
SetList(resultString.toString()); } catch (Exception e) { e.printStackTrace(); } }
private void SetList(String msg) {
MyStringParse mp = new MyStringParse(msg);
String header = mp.GetString();
if(header != "Recive_COOR") { return; }
size = Integer.parseInt(mp.GetString());
for(int i = 0 ; i < size ; i++) { _LatiList.add(Double.parseDouble(mp.GetString())); }
for(int i = 0 ; i < size ; i++) { _LongList.add(Double.parseDouble(mp.GetString())); }
for(int i = 0 ; i < size ; i++) { _ContentList.add(mp.GetString()); } }
public ArrayList<Double> getLatiList() {
return _LatiList; }
public ArrayList<Double> getLongList() {
return _LongList; }
public ArrayList<String> getContentList() {
return _ContentList; }
public int getSize() {
return size; } } |
CooRecive 클래스는 웹서비스를 이용하여 db에서 코스의 좌표를 불러오는 역할을 한다. 코스의 r_id를 받아서 해당코스의 좌표정보를 반환한다. |
MyStringParse Class
public class MyStringParse {
private int nowPosition; private String stringData;
public MyStringParse( String stringData ) { this.stringData = stringData; nowPosition = 0; }
public String GetString() { String rst = "";
While( stringData.charAt(nowPosition) != '/' ) { rst += stringData.charAt(nowPosition++); }
nowPosition++;
return rst; }
} |
MyStringParse 클래스는 언팩을 하는 클래스이다. 메시지를 받아서 메시지에서 '/'를 인식하여 나누어 준다. |
Test
가상의 코스를 등록하고 DB에 저장
Start버튼을 누르면 코스를 표시하기 시작하고 Stop 버튼을 누르면 도착지를 설정하고 코스표시를 멈춘다, 코스등록도중 Enter버튼을 이용하여 그 위치에 대한 간단한 정보를 표시할수 있다. Save을 누르면 표시된 코스가 DB에 저장된다.
DB에 저장된 가상의 코스를 가져와서 보여준다.
Load버튼을 누르면 DB에저장된 좌표를 가져와서 코스를 표시한다. Stop버튼을 누르면 맵에 표시된 코스를 초기화 한다,
-데이타 베이스
#2 사용한 기술
☆ 저장 프로시저 작성 할 때 Sql문 사용 한다
기본적인 구성문
◇ 데이터 변수 선언문
Declare @buf int
Keyword / 변수이름 / 데이터 타입
◇ 함수 호출 문
Exec MemberExist @m_id,@result output
Keyword / 함수명 / 보내는 값 / Keyword
◇ 대입 방법
set @m_state = 0
Keyword / 변수 / 대입 값
◇ 조건문(IF문)
IF (조건)
BEGIN
(실행문)
END
(조건에 맞지 않을 때)
ELSE
BEGIN
(실행문)
END
◇ 테이블에 추가
insert Member values(@m_id,@m_pw,@m_name,@m_point,@m_state)
Keyword/ 테이블병 / Keyword (보내는 값들 )
◇ 데이터 삭제
delete from Message where @m_id = m_id
Keyword / 테이블명 명시 Keyword / 테이블명 / 조건 Keyword / 조건
◇ 데이터 변경
update Member set m_point = @rePoint where m_id = @m_id
Keyword / 테이블명 / 변경 사항 / 조건 Keyword / 조건
☆ 프로시저 사용하는 부분
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//데이타베이스 연결
SqlConnection scon = new SqlConnection();
scon.ConnectionString = @"Data Source=504-4\SQL2005;Initial Catalog=Miss;Persist Security Info=True;User ID=sa;Password=1;";
//프로시저 연결
SqlCommand scom = new SqlCommand();
scom.CommandText = "InsertMember";
scom.CommandType = System.Data.CommandType.StoredProcedure;
scom.Connection = scon;
//첫번째 인자
SqlParameter param = new SqlParameter("m_id", "혼길동");
scom.Parameters.Add(param);
//두번째 인자
param = new SqlParameter("m_pw", "123");
scom.Parameters.Add(param);
//Return값
param = new SqlParameter("return", System.Data.SqlDbType.Int);
param.Direction = System.Data.ParameterDirection.Output;
scom.Parameters.Add(param);
scon.Open();
scom.ExecuteNonQuery();
int result = (int)scom.Parameters["return"].Value;
scon.Close();
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
☆ SqlReader 사용하는 부분
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
{
//데이타베이스 연결
byte[] bytes = new byte[1024];
MemoryStream ms = new MemoryStream(bytes);
BinaryWriter bw = new BinaryWriter(ms);
//쿼리문
SqlConnection scon = SqlConnect();
SqlCommand scom = new SqlCommand();
scom.CommandText = "select * from Note";
scom.Connection = scon;
//데이터를 저장 하기위해서 List사용
List<Note> NoteList = new List<Note>();
scon.Open();
//DataReader 선언
SqlDataReader sdr = scom.ExecuteReader();
//데이터 타입 & 변수명
int num;
string my_id;
string friend_id;
string n_exp;
//Class 선언
Note note;
//실제적인 데이터 저장
while (sdr.Read())
{
num = (int)sdr["n_num"];
my_id = sdr["m_id"] as string;
friend_id = sdr["f_id"] as string;
n_exp = sdr["n_exp"] as string;
//리스트로 저장
note = new Note(num, my_id, friend_id, n_exp);
NoteList.Add(note);
}
scon.Close();
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#3 General Library 내용
*BoardDll
*CoorDll
*FriendDll
*MemberDll
*NoteDll
*RouteDll
*SqlReaderDll
*TourLogDll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace GeneralLibrary
{
public class Library :MarshalByRefObject
{
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Member >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//방법1
//회원 가입
public bool RegMember(string id, string pw, string name)
{
MemberDll.Library ml = new MemberDll.Library();
return ml.RegMember(id, pw, name);
}
//방법2
//안드로이드 쪽 로그인
public bool AndroidLogin(string id, string pw)
{
Assembly asm = Assembly.Load("MemberDll");//namespace명
Type type = asm.GetType("MemberDll.Library");//namespace명.class명
object obj = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("AndroidLogin");//함수명
object[] obj2 = new object[2];
obj2[0] = id;
obj2[1] = pw;
if ((bool)mi.Invoke(obj, obj2))
{
return true;
}
return false;
}
//안드로이드 쪽 로그옷
public bool AndroidLogout(string id)
{
Assembly asm = Assembly.Load("MemberDll");//namespace명
Type type = asm.GetType("MemberDll.Library");//namespace명.class명
object obj = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("AndroidLogout");//함수명
object[] obj2 = new object[1];
obj2[0] = id;
if ((bool)mi.Invoke(obj, obj2))
{
return true;
}
return false;
}
//Web 쪽 로그인
public bool WebLogin(string id, string pw)
{
Assembly asm = Assembly.Load("MemberDll");//namespace명
Type type = asm.GetType("MemberDll.Library");//namespace명.class명
object obj = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("WebLogin");//함수명
object[] obj2 = new object[2];
obj2[0] = id;
obj2[1] = pw;
if ((bool)mi.Invoke(obj, obj2))
{
return true;
}
return false;
}
//Web 쪽 로그옷
public bool WebLogout(string id)
{
Assembly asm = Assembly.Load("MemberDll");//namespace명
Type type = asm.GetType("MemberDll.Library");//namespace명.class명
object obj = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("WebLogout");//함수명
object[] obj2 = new object[1];
obj2[0] = id;
if ((bool)mi.Invoke(obj, obj2))
{
return true;
}
return false;
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Member <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Note >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//쪽지 등록
public bool AddNote(string my_id, string friend_id, string contents)
{
NoteDll.Library nl = new NoteDll.Library();
return nl.AddNote(my_id, friend_id, contents);
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Note <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Board >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//게시판 글 등록
public bool AddBoard(string id, string titel, string exp)
{
BoardDll.Library bl = new BoardDll.Library();
return bl.AddBoard(id, titel, exp);
}
//게시판 글 삭제
public bool DeleteBoard(int num, string id)
{
BoardDll.Library bl = new BoardDll.Library();
return bl.DeleteBoard(num, id);
}
//게시판 글 수정
public bool ModifyBoard(int num, string id, string titel, string exp)
{
BoardDll.Library bl = new BoardDll.Library();
return bl.ModifyBoard(num, id, titel, exp);
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Board <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TourLog >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
public bool CreateTourlog(string id, string titel, string exp, string date)
{
TourLogDll.Library tl = new TourLogDll.Library();
return tl.CreateTourlog(id, titel, exp, date);
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TourLog <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Coor >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//좌표 추가
public bool InsertCoor
(int r_num, float c_la, float c_long, string c_exp, int c_step, string c_date)
{
CoorDll.Library cl = new CoorDll.Library();
return cl.InsertCoor(r_num, c_la, c_long, c_exp, c_step, c_date);
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Coor <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Friend >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//친구 추가 기능
public bool AddFriend(string my_id, string friend_id)
{
FriendDll.Library fl = new FriendDll.Library();
return fl.AddFriend(my_id, friend_id);
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Friend <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Route >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//코스 만들기
public bool CreateRoute(string id, string route_name, string exp)
{
RouteDll.Library rl = new RouteDll.Library();
return rl.CreateRoute(id, route_name, exp);
}
//코스 평가 수정
public bool CourseEvaluation(int route_num, int evaluation)
{
RouteDll.Library rl = new RouteDll.Library();
return rl.CourseEvaluation(route_num, evaluation);
}
//코스의 평가 가져오기
public int GetGrade(int route_num)
{
RouteDll.Library rl = new RouteDll.Library();
return rl.GetGrade(route_num);
}
//코스의 좌표 개수 가져오기
public int GetRouteCoorCount(int route_num)
{
RouteDll.Library rl = new RouteDll.Library();
return rl.GetRouteCoorCount(route_num);
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Route <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SqlReader>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//쪽지 Table에 있는 데이터 가져오기
public string GetNoteTable()
{
SqlReaderDll.Library sl = new SqlReaderDll.Library();
return sl.GetNoteTable();
}
//좌표 Table에 있는 데이터 가져오기
public string GetCoorTable()
{
SqlReaderDll.Library sl = new SqlReaderDll.Library();
return sl.GetCoorTable();
}
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< SqlReader<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
}
}
#4. WinService 내용 & 설정 방법
☆ WinService 내용
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
static void Main(string[] args)
{
HttpChannel hc = new HttpChannel(10220);
ChannelServices.RegisterChannel(hc);
RemotingConfiguration.RegisterWellKnownServiceType
(typeof(GeneralLibrary.Library),
"GroupProject.soap", WellKnownObjectMode.SingleCall);
Console.WriteLine("가동중...");
Console.Read();
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
☆ 설정 방법
No.1 일단, 위의 코드를 실행하고 실행 파일을 만든다
No.2 [Visual Studio 2008 명령 프롬프트]를 실행한다
No3. [그림A] 처럼 입력한다
#6 제가 프로젝트 내에서 했던 것
@제안서를 아이디어를 내고 작성
@증간현실 구현하기 위해서 ARToolKit 설치 & Sample실행
@ Android Map 표시
@HTML사용하고 GoogleMap표시& Marker표시 하는 HP작성
-안드로이드 폼
로그인
첨 화면으로
자신의 아이디와 패스워드를 치고
그 아이디와 패스워드를 웹 서비스를 통해 DB에 확인 한후
아이디와 패스워드가 맞다면
다음 기능 메인 창으로 이동
만약 맞지 않으면 맞지 않는다고 확인해 달라는 메시지 보냄
아래 회원가입 버튼을 클릭하면 회원가입 창이 뜬다
회원가입
처음 화면으로
자신의 아이디와 패스워드이름을 넣고
그 아이디와 패스워드를 웹 서비스를 통해 DB에 존재하는지를 확인후
없다면 회원가입이 성공한다
만약 있다면 실패.
기능 메인
주요 기능을 보여는 기능 메인창으로
여행가이드- 여행을 할 때 필요한 기능들의 모음
친구 관리- 친구추가와 친구 확인 등의 기능들의 모음으로 나뉜다
n technology
-개발환경
Visual Studio 2008
android-sdk-windows
eclipse-jee-helios-win32
-프로젝트환경
Visual Studio 2008
eclipse
n Reference
-Book
C# and the .NET Platform
(알짜로 골라 배우는)안드로이드 프로그래밍
안드로이드 프로그래밍 정복: 안드로이드 SDK 2.1= Android programming complete guide
.NET Enterprise System 객체 지향 CBD 개발 방법론
Learning OpenCV 제대로 배우기 : OREILLY
-Web_Site
OpenCV KOREA 카페 : http://cafe.naver.com/opencv
|