obraz floating world

Transkrypt

obraz floating world
Mobilne Aplikacje Multimedialne
Rozszerzona rzeczywistość (AR, Augmented
Reality) w Systemie Android Cz.2
Krzysztof Bruniecki
Układy odniesienia
Już znamy
ZB
YB
XB
autor: Krzysztof Bruniecki
2
ECEF (ang. Earth-Centered, EarthFixed)
autor: Krzysztof Bruniecki
3
Konwersja do ECEF
•
•
•
•
•
a, b – półoś wielka, mała
f – spłaszczenie
 – szerokość geograficzna
 – długość geograficzna
h – wysokość
b  a a f
a
e  (a  b ) / a
v
(1  e 2 sin 2  )1 / 2
X  (v  h) cos  cos 
2
2
2
2
Y  (v  h) cos  sin 
Z  (v(1  e )  h) sin 
2
autor: Krzysztof Bruniecki
4
ECEF->ENU (m-frame)
• ENU (ang. East, North, Up) = Mapping frame
• XECEF, YECEF, ZECEF – współrzędne punktu
• X’ECEF , Y’ECEF , Z’ECEF – współrzędne lokalne (środka układu ENU
• E, N, U – współrzędne punktu w układzie lokalnym ENU (m-frame)
 E    sin 
 N    cos  sin 
  
U   cos  cos 
cos 
 sin  sin 
sin  cos 
0   X ECEF  X ' ECEF 
cos    YECEF  Y ' ECEF 
sin    Z ECEF  Z ' ECEF 
autor: Krzysztof Bruniecki
5
Deklinacja magnetyczna
• Kąt pomiędzy południkiem
magnetycznym oraz południkiem
geograficznym
• Podawany w danym punkcie Ziemi
• Kąt płaski, podawany jak azymut
• Wpływa na nią
– położenie bieguna magnetycznego
Ziemi
– lokalne uwarunkowania geologiczne
(rudy żelaza, itp.)
– czas
autor: Krzysztof Bruniecki
6
Main Field Declination –
The World Magnetic Model
autor: Krzysztof Bruniecki
7
GeomagneticField (1)
•
•
•
•
•
•
•
•
•
Klasa: class GeomagneticField extends Object
Pakiet: android.hardware.GeomagneticField
Estymuje pole magnetyczne w podanym punkcie na Ziemi
Pozwala na oszacowanie deklinacji magnetycznej od prawdziwej
północy
Jako model wykorzystuje World Magnetic Model (United States
National Geospatial-Intelligence Agency)
http://www.ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml.
Używa modelu z 2010 roku (WMM-2010)
Wg standardu ważny do 2015, ale będzie dawał racjonalne wyniki
jeszcze wiele lat później
W nowszych wersjach Androida może być wprowadzony nowszy
model
autor: Krzysztof Bruniecki
8
GeomagneticField (2)
• Konstruktor:
GeomagneticField(float gdLatitudeDeg, float
gdLongitudeDeg, float altitudeMeters, long timeMillis)
Obiekt służący do estymacji pola magnetycznego Ziemi
w zadanym miejscu i czasie
– gdLatitudeDeg Szerokość WGS84 w stopniach – dodatnia
na zachód
– gdLongitudeDeg długość WGS84 w stopniach – dodatnia
na północ
– altitudeMeters Wysokość elipsoidalna WGS84, w metrach
– timeMillis milisekundy od 1 stycznia 1970 (można podać
wartość przybliżoną
autor: Krzysztof Bruniecki
9
GeomagneticField (3)
• Metody
public float getDeclination ()
– Zwraca deklinację magnetyczną
public float getInclination ()
– Zwraca inklinację magnetyczną (wartość dodatnia
oznacza że pole jest skierowane w dół względem
płaszczyzny Ziemi)
autor: Krzysztof Bruniecki
10
GeomagneticField (4)
public float getFieldStrength ()
Siła pola w nanoteslach
public float getHorizontalStrength ()
Pozioma składowa pola magnetycznego w nanoteslach
public float getX ()
Składowa skierowana na północ (geograficzną) w
nanoteslach
public float getY ()
Składowa skierowana na wschód (geograficzny) w
nanoteslach
public float getZ ()
Składowa skierowana w dół w nanoteslach
autor: Krzysztof Bruniecki
11
Obrót elementarny
Jak wykorzystać informacje z
modelu magnetycznego?
autor: Krzysztof Bruniecki
12
Kąt pomiędzy wektorami
autor: Krzysztof Bruniecki
13
Omówienie zadań laboratoryjnych (1)
Zaimplementować mechanizm wyszukiwania
Warszawy (z tolerancją +-10 stopni).
Pozycję bieżącą oraz pozycję Warszawy można
umieścić bezpośrednio w kodzie. Można
rozważać sytuację dwuwymiarową.
autor: Krzysztof Bruniecki
14
Omówienie zadań laboratoryjnych (2)
Utworzyć interfejs użytkownika umożliwiający
dodawanie nowych lokalizacji (a dokładnie
wektora wskazującego lokalizację) poprzez
wskazanie urządzeniem i dodanie opisu.
Następnie umożliwić przeszukiwanie tej bazy
poprzez zmianę orientacji urządzenia.
Podpowiedź: jako kryterium bliskości
wektorów posłużyć się kątem pomiędzy nimi.
autor: Krzysztof Bruniecki
15
Przykład
• Załóżmy następujące położenie (nasze):
– 18E 55N 0m(wysokość)
• Punkty wykrywane:
–
–
–
–
–
18.0001E 55.0001N 1000m Gdzieś nad horyzontem
17E 55N 0m
Zachód
18E 55N 1000m
Góra
19E 56N 0m
Północny wschód
0E 90N 100000000000m Gwiazda polarna
• WGS84
– a = 6.378.137,0 m
– b = 6.378.137,0 m
• Uwaga na radiany/stopnie
autor: Krzysztof Bruniecki
16
Model kamery otworkowej
Jak należałoby zamontować kamerę w smartfonie żeby układ kamery zgadzał się z
układem b-frame?
autor: Krzysztof Bruniecki
17
Układ kamery (back-facing)
ZB
YB
XB
YC
ZC
autor: Krzysztof Bruniecki
XC
18
Model kamery otworkowej (2)
Przekrój w płaszczyźnie
YZ
autor: Krzysztof Bruniecki
19
Układ kamery a układ obrazu
Jak przeliczyć wektor wyrażony w b-frame do współrzędnych w pikselach?
Jak przeliczyć współrzędne w układzie obrazu na współrzędne bitmapy?
autor: Krzysztof Bruniecki
20
Przykład
• Jakie jest położenie obrazu (w płaszczyźnie
obrazowania) punktu o współrzędnych
(względem kamery)
[50m, -30m, 50m] dla kamery o ogniskowej
f=1cm?
• Jakie jest położenie obrazu punktu o
współrzędnych [-20m, -20m, -40m]?
autor: Krzysztof Bruniecki
21
Współrzędne jednorodne
• Sposób reprezentacji punktów w n wymiarowych
przestrzeniach za pomocą n+1 współrzędnych
• dla n=2, punkt (x,y) w przestrzeni kartezjańskiej
jest reprezentowany przez (x,y,1)=(wx,wy,w) dla
w!=0
• punkty (x,y,0) reprezentują punkty w
nieskończoności
• Zaletą współrzędnych jednorodnych jest
możliwość zwięzłego opisu przekształceń, takich
jak translacja, obrót, skalowanie, rzut
perspektywiczny przy użyciu macierzy
autor: Krzysztof Bruniecki
22
Macierz kalibracji kamery
 x s
K   0  y
 0
0
x0 
y0 
1 
x=fkx, y=fky – są długościami ogniskowej wyrażonymi w liczbie
pikseli poziomych i pionowych,
kx, ky – liczby pikseli na milimetr w poszczególnych osiach kamery,
x0,y0 – współrzędne punktu głównego w układzie obrazu,
s – współczynnik skośności osi x i y,
Założyć że w Samsungu Galaxy S
(dostępnym na zajęciach laboratoryjnych). Jak określić macierz kalibracji?
Obszar widoczności kamery
51,2x39,4
szerokość/wysokość [stopnie]
autor: Krzysztof Bruniecki
23
Macierz rzutu perspektywicznego
K – macierz kalibracji
R – macierz rotacji kamery
t – macierz translacji kamery
Jeżeli wektor q wyrażony jest w układzie kamery wówczas macierz
rzutu perspektywicznego przyjmuje uproszczoną postać
autor: Krzysztof Bruniecki
24
Camera API
• android.hardware.Camera
• <uses-permission android:name="android.permission.CAMERA" />
• <uses-feature android:name="android.hardware.camera" />
• <uses-feature android:name="android.hardware.camera.autofocus" />
• Rysowanie na podglądzie z kamery
• W Android Manifest ustawić layout
aktywności jako horizontal
autor: Krzysztof Bruniecki
25
Włączanie podglądu i wykonywanie
zdjęć
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Pobrać instancję kamery z użyciem open(int).
Odczytać parametry getParameters() jako instancję klasy Camera.Parameters
Zmodyfikować parametry (jeśli to konieczne) poprzez
setParameters(Camera.Parameters)
Jeśli konieczne to ustalić orientację ekranu względem podglądu z kamery
setDisplayOrientation(int).
Przekazać zainicjalizowany obiekt SurfaceHolder do metody
setPreviewDisplay(SurfaceHolder).
Wywołać startPreview() aby rozpocząć podgląd z kamery na ekranie (musi być
włączony podgląd żeby rozbić zdjęcia)
Wywołać takePicture(Camera.ShutterCallback, Camera.PictureCallback,
Camera.PictureCallback, Camera.PictureCallback) żeby zrobić zdjęcie. Obsłużyć
Callbacki.
Po wykonaniu zdjęcia podgląd będzie zatrzymany. Aby wykonać kolejne wywołać
startPreview()
Wywołać stopPreview() żeby zatrzymać podgląd
Wywołać release() dla innych aplikacji. Należy zrobić to niezwłocznie w onPause()
(otworzyć ponownie używając open() w onResume())
autor: Krzysztof Bruniecki
26
SurfaceView
class Preview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera camera;
Preview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
//musi być mimo że jest w dokumentacji jest deprecated
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
autor: Krzysztof Bruniecki
27
SurfaceHolder.Callback
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();
}
autor: Krzysztof Bruniecki
28
Rysowanie na SurfaceView
• Nałożenie nowej warstwy na SurfaceView
• SurfaceView domyslnie rysowany jest za oknem
• Przygotowanie interfejsu użytkownika w XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:id="@+id/relativeLayout1"
android:layout_width="match_parent"
android:keepScreenOn="true"></RelativeLayout>
autor: Krzysztof Bruniecki
29
public class MojeView extends View
public class MojeView extends View{
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
p.setARGB(255, 255, 0, 0);
canvas.drawText("MojeView.onDraw: i="+i++, 200, 100, p);
canvas.drawText("MojeView.onDraw: j="+j++, 200, 150, p);
if(dane!=null)
{
canvas.drawLine(0, 0, 100*dane[0], 100*dane[0], p);
p.setStyle(Style.STROKE);
canvas.drawRect(100, 100, 200, 200, p);
}
}
}
autor: Krzysztof Bruniecki
30
Dodanie kontrolek do okna
•
Dodanie SurfaceView i kontrolki do okna
setContentView(R.layout.main);
rl = (RelativeLayout)findViewById(R.id.relativeLayout1);
myCameraView = new Preview(this);
rl.addView(myCameraView);
myCameraOverlay = new MojeView(this);
rl.addView(myCameraOverlay);
•
Odrysowanie kontrolki
myCameraView.invalidate();
autor: Krzysztof Bruniecki
31
Nowsze API... Klasa Camera
• public final void setDisplayOrientation (int degrees)
• public static int getNumberOfCameras ()
• public final void setFaceDetectionListener
(Camera.FaceDetectionListener listener)
• public final void startFaceDetection ()
autor: Krzysztof Bruniecki
32

Podobne dokumenty