Windows에서 사용할 수 있는 VisualStudio의 가격이 만만치 않다.
그래서 이번에 큰 맘먹고 Windows에서 개발을 해보기로 하겠다. ㅋㅋ

1. cygwin이 필요하다. ==> http://www.cygwin.com/setup.exe 다운받으시고
2. cygwin을 설치하자
  setup.exe를 설치하면 다음과 같은 화면이 나온다. 놀라지 마라.그냥 install하지 말고 local에 저장하자.
  다음으로 넘어가면 이제 다운로드를 할 경로를 설정하고 환경을 맞춘다음 사이트를 선택해야 한다. kaist도 있지만 난 그냥 일본 사이트에서 다운로드 했다.

3. 다운로드가 완료되면 다시 한 번 setup.exe를 실행한 후 이번에는 설치하자. 

4. 자 이제 설치가 끝났다.
Posted by 피의복수

아마도 카메라 영상의 이미지에서 Marker를 추출하고 인식하는 것이 가장 우선되어야 할 것이다.
다만 서비스에 따라서 이 Marker를 Tracking할 것인가 아니면 단순히 인식만 할 것인 가가 이슈가 되겠다.

간단한 샘플
http://technotecture.com/content/sstt-visualizer-augmented-reality-demo
위 URL에서 제공하는데로 하면 간단한 샘플을 볼 수 있다.

우선적으로 iPhone에서 사용할 수 있는 ARToolkit을 먼저 알아보자. (구현하는 방식은 알겠지만 헉....언제 만들어?)

http://sproke.blogspot.com/2009/11/augmented-reality-resources-for.html
나름 ARToolkit의 종류에 대해 정리를 잘 해놓은 것 같다.
 근데 어떻게 쓸까?

아래 사이트에서는 Windows환경에서 OpenCV를 이용한 마커 추출/검증 및 동영에 대한 강좌를 제공한다.
http://martinblog.tistory.com/category/%5B%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%5D/%EA%B0%95%EC%A2%8C

.Net 기반이기는 하지만 얼 추 원리를 설명함.
http://whatisthat.co.kr/tag/AR


전체적으로 기본적인 원리는 카메라 영상에 대한 이진화를 한 후 각 영상에 대한 라벨링 후 마커를 추출하는 방법을 사용한다. 또한 추출된 마커의 꼭지점을 계산하여 해당 영역에 동영상이나 3D 같은 컨텐트를 출력하게 하는 방법을 사용한다.


Posted by 피의복수



android.os.Build.MODEL 을 확인해 보면 "sdk"라고 나올 경우는 에뮬레이터 환경

기타 제조사등의 정보도 android.os.Build를 확인하면 가능함.

SystemProperty를 통해서 알수 있는 방법도 확인이 필요함.
(SystemProperties는 private 영역으로 접근 불가함.)
Posted by 피의복수

자 이제 MapView를 통해 구글이 제공하는 지도를 볼 수 있다는 것을 알았고, 그 위에 마커를 올려줄 수 있다는 것을 확인했다.
근데 Map 예제를 보면서 왜 지도가 세계지도로 나올까? 난 이게 참 궁금했다.
확인해보니 Map과 관련된 Control을 관리해 주어야 하는 구만.
그럼 지금부터는 진짜 지도를 보자.

MapView를 사용하기 위해서는 manifest.xml에
<uses-library android:name="com.google.android.maps" /> 과
<uses-permission android:name="android.permission.INTERNET" /> 를 추가해 주어야 한다는 것을 이미 배웠다.

이런 식으로 GPS를 확인하기 위해 다음과 같은 permission이 추가되어야 한다.
 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>   
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

하나씩 설명하기 어려우니 작성한 소스를 올린다.

package com.bloodlee;

/**
 * MapView를 위한 Sample을 작성합니다.<br>
 * 1. 현재 GPS 정보를 조회하여 Map을 그립니다.<br>
 * 2. GPS 정보가 변경되면 해당 위치를 다시 그립니다.<br>
 * 3. 혠 wjdqh
 * @author bloodlee
 */

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import com.bloodlee.R;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class MapviewSample extends MapActivity implements LocationListener{

 MapController mc;
 
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        // MapView 생성
        MapView mapView = (MapView) findViewById(R.id.mapview);
        // MapView 하단에 Zoom 생성
        mapView.setBuiltInZoomControls(true);

        // LocationManager를 구한다.
        LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // 현재 시스템의 LocationManager에서 활성화된 Provider를 조회한다.
        List<String> providers = locManager.getProviders(true);
        for(int i=0; i < providers.size();i++)
         Log.i("Providers in LocationManager",providers.get(i));

        // Provider의 조건으로 최적의 Provider를 조회한다.
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        String provider = locManager.getBestProvider(criteria, true);
     Log.i("BestProvider",provider);

        // Provider에 저장된 최종 위치 정보를 조회한다.
     Location loc = locManager.getLastKnownLocation(provider);
        GeoPoint p = null;
        // Provider를 통해 현재 위치를 조회한다.
        if(loc != null){
         int lat = (int)(loc.getLatitude()* 1E6);
         int lng = (int)(loc.getLongitude() * 1E6);
         p = new GeoPoint(lat, lng);
         Log.i("GPS Information","[" + lat + "],[" + lng + "]");
        }
        else{ // 현재 위치를 조회할 수 없는 경우 기본값(명동)을 설정한다.
         Log.i("GeoPoint","Location is null");
         p = new GeoPoint(37559978,126985806);
        }
        Log.i("Address",getAddress(p));
       
        mc = mapView.getController();
        mc.animateTo(p);
        // Zoom Level을 설정한다. 1 ~ 21까지. 21이면 최대 확대
        mc.setZoom(15);
       
        // GPS 정보가 변경을 조회한다. GPS가 변경되면 onLocationChanged 호출
     locManager.requestLocationUpdates(provider, 1000L, 500.0f, this);
     
    }
   
    /**
     * LocationListener를 통해 GPS 정보가 변경되는 경우 호출
     */
 public void onLocationChanged(Location loc) {
  if (loc != null) {
         int lat = (int)(loc.getLatitude()* 1E6);
         int lng = (int)(loc.getLongitude() * 1E6);

   GeoPoint p = new GeoPoint(lat, lng);
   mc.animateTo(p);
         Log.d("onLocationChanged","[" + lat + "],[" + lng + "]");
            Log.i("Address",getAddress(p));
  }
 }

 public void onProviderDisabled(String provider) {
  // required for interface, not used
 }
 
 public void onProviderEnabled(String provider) {
  // required for interface, not used
 }
 
 public void onStatusChanged(String provider, int status, Bundle extras) {
  // required for interface, not used
 }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
   
    /**
     * 취치 정보로 해당 주소 정보를 조회한다.
     */
    private String getAddress(GeoPoint p){
        // 주소 정보를 조회합니다.
     // 한국 주소가 잘 안나오는 것 같다.
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
     StringBuilder sb = new StringBuilder();
        try{
         List<Address> addrList = geocoder.getFromLocation((double)(p.getLatitudeE6() / 1E6),
                       (double)(p.getLongitudeE6() / 1E6),
                                                         10);
            if (addrList.size() > 0) {
             Address addr = addrList.get(0);

             /* 잘 안나옴.
             for (int i = 0; i < addr.getMaxAddressLineIndex(); i++)
              sb.append(addr.getAddressLine(i)).append(", ");
             Log.i("addr.getAddressLine(i))", sb.toString());

             sb.append(addr.getAdminArea()).append(", ");
             if(addr.getAdminArea() != null)
             Log.i("addr.getAdminArea()", addr.getAdminArea());
             sb.append(addr.getSubAdminArea()).append(", ");
             if(addr.getSubAdminArea() != null)
             Log.i("addr.getSubAdminArea()", addr.getSubAdminArea());
             sb.append(addr.getPremises()).append(", ");
             if(addr.getPremises() != null)
             Log.i("addr.getPremises()", addr.getPremises());
             */
             sb.append(addr.getFeatureName()).append(", "); // 번지
             sb.append(addr.getLocality()).append(", "); // 시, 군
             sb.append(addr.getPostalCode()).append(", ");
             sb.append(addr.getCountryName());

             Log.i("Address", sb.toString());
             Toast.makeText(MapviewSample.this, sb.toString(), Toast.LENGTH_LONG).show();
            }

        }catch(IOException ioe){
         Log.e("Exception on getting Geocoder", ioe.getLocalizedMessage());
        }
     return sb.toString();
    }
}


 

Posted by 피의복수

1. aapt(Android Asset Packaging Tool)
  - 안드로이드 패키징 Tool
  - eclipse의 ADT를 사용하고 있다면 굳이 볼 필요는 없음.

2. adb(Android Debug Bridge)
  - emulator instance나 device의 상태를 관리하는 Tool
  - Clietn / Server로 구성(Server는 emulator나 Device의 daemon과 client와의 Communication을 관리한다.
  - Client를 실행하면 Server의 활성화를 확인하며, 활성화되지 않은 경우 Server를 시작한다.
  - Server는 local TCP port 5037에 bind한다.
  - Server는 emulator와 Device에서 사용하는 5555에서 5585까지의 port를 스캔한다.
  - emulator와 Device은 한쌍의 순차적 port를 사용하는데, emulator가 5554를 사용하면 adb는 5555를 사용한다.

  1) emulator/Device Instance조회
    > adb devices
[serialNumber] [state] -- state: offlline or device

List
of devices attached
emulator
-5554  device
emulator
-5556  device
emulator
-5558  device 
 
  2) 특정 emulator/Device에 Command 실행
    > adb -s <serialNumber> <command>
adb -s emulator-5556 install helloWorld.apk

  3) Application 설치
    > adb install <path_to_apk>

  4) Forwarding Port
    > adb forward tcp:<port> tcp:<port>

  5) copy file to or from emulator/device instance
    > adb pull <remote> <local>

    > adb push <local> <remote>

  6) 기타 Command는 http://developer.android.com/guide/developing/tools/adb.html#commandsummary 참조



 
Posted by 피의복수

BLOG main image
일에 필요한 자료 by 피의복수

카테고리

분류 전체보기 (40)
프로그램이야기 (38)
끄적끄적 (1)
취미 (0)
서비스이야기 (1)
빅데이터 (0)

최근에 올라온 글