A talk from the Develop Track at AWE USA 2017 - the largest conference for AR+VR in Santa Clara, California May 31- June 2, 2017.
Kenn Song (VisionStar): EasyAR 2.0 - New Features and Changes
EasyAR is an augmented reality SDK designed to build AR applications easily and smoothly. EasyAR 2.0 is a major update with many new features since the first public release. It brings amazing experience improvements with SLAM and 3D object tracking. And it makes AR easier to build with APIs exported into many different coding languages, easier to share with cloud recognition and scene recording.
http://AugmentedWorldExpo.com
2. In today’s session
• VisionStar & EasyAR & AWE
• EasyAR 2.0
• Workflow & API changes
• Samples for different languages
• SLAM
• 3D Object Tracking
3. VisionStar & EasyAR & AWE
• VisionStar
• EasyAR
• AR SDK and more
• SightPlus
• AR Browser powered by EasyAR
• EasyAR
• 1.0 released at AWE Asia 2015
• 1.3 released a few days before AWE USA 2016
• 2.0 released a few days before AWE USA 2017
5. EasyAR SDK 2.0
• Workflow & API changes – New language bindings
• C API
• C++11 API
• traditional C++ API
• Java API for Android
• Objective-C API for iOS
• Unity3D API
6. EasyAR SDK 2.0
• Workflow & API changes
• Building up
class HelloCallBack : public TargetLoadCallBack
{
Public:
virtual void operator() (const Target target, const bool status)
{
// log
}
};
CameraDevice camera;
camera.open();
ImageTracker tracker;
tracker.attachCamera(camera_);
ImageTarget target;
target.load(path.c_str(),
EasyAR::kStorageAssets,
targetname.c_str()
);
tracker.loadTarget(target, new HelloCallBack());
auto camera = std::make_shared<easyar::CameraDevice>();
camera->open(static_cast<int>(easyar::CameraDeviceType::Default));
auto streamer = std::make_shared<easyar::CameraFrameStreamer>();
streamer->attachCamera(camera);
auto tracker = std::make_shared<easyar::ImageTracker>();
tracker->attachStreamer(streamer);
auto target = std::make_shared<easyar::ImageTarget>();
target->setup(path,
static_cast<int>(easyar::StorageType::Assets),
targetname
);
tracker->loadTarget(target,
[](std::shared_ptr<easyar::Target> target, bool status) { // log}
);
1.3 2.0
7. EasyAR SDK 2.0
• Workflow & API changes
• Start
• Frame update & rendering
Frame frame = augmenter.newFrame();
for (int i = 0; i < frame.targets().size(); ++i) {
AugmentedTarget::Status status = frame.targets()[i].status();
if (status == AugmentedTarget::kTargetStatusTracked) {
// render
}
}
auto frame = streamer->peek();
for (auto && targetInstance : frame->targetInstances()) {
auto status = targetInstance->status();
if (status == easyar::TargetStatus::Tracked) {
// render
}
}
camera.start();
tracker.start();
camera->start();
streamer->start();
tracker->start();
1.3 2.0
8. EasyAR SDK 2.0
• Samples for different languages – C++11
auto camera = std::make_shared<easyar::CameraDevice>();
camera->open(static_cast<int>(easyar::CameraDeviceType::Default));
auto streamer = std::make_shared<easyar::CameraFrameStreamer>();
streamer->attachCamera(camera);
auto tracker = std::make_shared<easyar::ImageTracker>();
tracker->attachStreamer(streamer);
auto target = std::make_shared<easyar::ImageTarget>();
target->setup(path, static_cast<int>(easyar::StorageType::Assets), targetname);
tracker->loadTarget(target, [](std::shared_ptr<easyar::Target> target, bool status) { // log});
camera->start();
streamer->start();
tracker->start();
auto frame = streamer->peek();
for (auto && targetInstance : frame->targetInstances()) {
auto status = targetInstance->status();
if (status == easyar::TargetStatus::Tracked) {
// render
}
}
9. EasyAR SDK 2.0
• Samples for different languages – Java
CameraDevice camera = new CameraDevice();
camera.open(CameraDeviceType.Default);
CameraFrameStreamer streamer = new CameraFrameStreamer();
streamer.attachCamera(camera);
ImageTracker tracker = new ImageTracker();
tracker.attachStreamer(streamer);
ImageTarget target = new ImageTarget();
target.setup(path, StorageType.Assets, targetname);
tracker.loadTarget(target, new FunctorOfVoidFromPointerOfTargetAndBool() {
@Override
public void invoke(Target target, boolean status) { //log }}
);
camera.start();
streamer.start();
tracker.start();
Frame frame = streamer.peek();
try {
for (TargetInstance targetInstance : frame.targetInstances()) {
int status = targetInstance.status();
if (status == TargetStatus.Tracked) {
// render
}
}
}
finally {
frame.dispose();
}
11. EasyAR SDK 2.0
• SLAM (Pro)
• Instant initialization
• Fast relocalization
• Robust to strong motion blur
• Optimized for mobile devices
• Optimized for low texture scenes
12. EasyAR SDK 2.0
• SLAM (Pro)
tracker = new ARSceneTracker();
tracker.attachStreamer(streamer);
tracker.start();
Frame frame = streamer.peek();
try {
for (TargetInstance targetInstance : frame.targetInstances()) {
int status = targetInstance.status();
if (status == TargetStatus.Tracked) {
Target target = targetInstance.target();
ARScene scene = target instanceof ARScene ? (ARScene)(target) : null;
if (scene == null)
continue;
// render
}
}
finally {
frame.dispose();
}
14. EasyAR SDK 2.0
• 3D Object Tracking (Pro)
• Runtime target generation from
standard wavefront obj model files
• No strict limitations for the
physical size of 3D objects
• Recognize and track any 3D object
after loading multiple objects
• Recognize and track multiple
3D objects simultaneously
15. EasyAR SDK 2.0
• 3D Object Tracking (Pro)
tracker = new ObjectTracker();
tracker.attachStreamer(streamer);
target = new ObjectTarget();
target.setup(path, StorageType.Assets, targetname);
tracker.loadTarget(target, new FunctorOfVoidFromPointerOfTargetAndBool() {
@Override
public void invoke(Target target, boolean status) { //log }}
);
tracker.start();
Frame frame = streamer.peek();
try {
for (TargetInstance targetInstance : frame.targetInstances()) {
int status = targetInstance.status();
if (status == TargetStatus.Tracked) {
Target target = targetInstance.target();
ObjectTarget objecttarget = target instanceof ObjectTarget ? (ObjectTarget)(target) : null;
if (objecttarget == null)
continue;
// render
}
}
}
finally {
frame.dispose();