Réalité augmentée sur des objets en rotation
ImageDisplacements capture le champ de flux optique dans une séquence vidéo en temps réel. À travers la boucle , vous pouvez détecter un mouvement de rotation de la main devant votre caméra intégrée. Vous pouvez ainsi augmenter ou diminuer l'heure d'une horloge virtuelle dans un exemple de réalité augmentée.
La boucle d'un champ vectoriel détermine la quantité inhérente de rotation.
In[1]:=
listCurl =
flow \[Function]
ListConvolve[{{0.5`, 0, -0.5`}},
flow[[All, All, 2]], {{1, 2}, {1, 2}}, "Fixed"] -
ListConvolve[{{-0.5`}, {0.`}, {0.5`}},
flow[[All, All, 1]], {{1, 2}, {1, 2}}, "Fixed"];
Afficher l'entrée complète de Wolfram Language
Le code complet de cet exemple de réalité augmentée tient sur moins d'une page.
In[3]:=
DynamicModule[
{frames, flow, curl, mask, time = 0, W = 320, H = 240, w = 240,
h = 160, r = 64},
(* specify a sensitive image region *)
mask = ImageCompose[
ConstantImage[0, {W, H}],
ImageAdjust[Image[GaussianMatrix[r/2]]],
{w, h}
];
(* initialize the optical flow acquisition *)
frames = Table[preProcessFrame@CurrentImage[], {2}];
flow = First@ImageDisplacements[frames];
Graphics[
{Inset[
(* read and display camera image, determine the curl *)
Dynamic[
frames[[1]] = frames[[2]];
frames[[2]] = preProcessFrame@CurrentImage[];
flow = First@ImageDisplacements[frames, 0.7 flow];
curl = Image@listCurl@flow;
time -= 2 ImageMeasurements[curl, "Mean", Masking -> mask];
frames[[2]]
],
{0, 0}, {0, 0}, {W, H}
],
Inset[
(* display clock *)
Dynamic[
ClockGauge[
DatePlus[Date[], {Round[5 time, 5], "Minute"}],
GaugeStyle -> RGBColor[1, 0.75, 0],
LabelStyle -> White,
GaugeFaceStyle -> Opacity[0.1]
],
UpdateInterval -> 1
],
{w, h}, {0, 0}, {2 r, 2 r}
]
},
PlotRange -> {{0, W}, {0, H}},
ImageSize -> {W, H}
]
]