forked from ifm/libo3d3xx
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ex-100k.cpp
101 lines (88 loc) · 3.04 KB
/
ex-100k.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
* Copyright (C) 2016 Love Park Robotics, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distribted on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//
// ex-100k.cpp
//
// Shows how to use the API to create a new application, set its resolution to
// 100K, and stream data from the camera in that mode. We note that you really
// should use `o3d3xx-dump` and `o3d3xx-config` to create an application that
// employs the 100k imager, set it as active, and simply stream data from it
// rather than using the API to manipulate the applications on the
// camera. However, we have gotten enough requests for this, that we are going
// to show how to do it.
//
#include <iostream>
#include <memory>
#include <opencv2/opencv.hpp>
#include <pcl/point_cloud.h>
#include "o3d3xx_camera.h"
#include "o3d3xx_framegrabber.h"
#include "o3d3xx_image.h"
int main(int argc, const char **argv)
{
o3d3xx::Logging::Init();
//
// setup
//
o3d3xx::Camera::Ptr cam = std::make_shared<o3d3xx::Camera>();
cam->RequestSession();
cam->SetOperatingMode(o3d3xx::Camera::operating_mode::EDIT);
o3d3xx::DeviceConfig::Ptr dev = cam->GetDeviceConfig();
int old_active_idx = dev->ActiveApplication();
int idx = cam->CopyApplication(old_active_idx);
cam->EditApplication(idx);
o3d3xx::ImagerConfig::Ptr im = cam->GetImagerConfig();
im->SetResolution(o3d3xx::RES_100K);
cam->SetImagerConfig(im.get());
cam->SaveApp();
dev->SetActiveApplication(idx);
cam->SetDeviceConfig(dev.get());
cam->SaveDevice();
cam->CancelSession();
//
// stream data -- we will grab 5 images then exit
//
o3d3xx::FrameGrabber::Ptr fg = std::make_shared<o3d3xx::FrameGrabber>(cam);
o3d3xx::ImageBuffer::Ptr img = std::make_shared<o3d3xx::ImageBuffer>();
pcl::PointCloud<o3d3xx::PointT>::Ptr cloud;
cv::Mat amplitude;
for (int i = 0; i < 5; ++i)
{
if (! fg->WaitForFrame(img.get(), 1000))
{
std::cerr << "Timeout waiting for camera!" << std::endl;
continue;
}
cloud = img->Cloud();
amplitude = img->AmplitudeImage();
// print out dims as rows x cols
std::cout << "Cloud dimensions: "
<< cloud->height << "x" << cloud->width << std::endl;
std::cout << "Amplitude dimensions: "
<< amplitude.size().height << "x"
<< amplitude.size().width << std::endl << std::endl;
}
//
// clean up
//
cam->RequestSession();
cam->SetOperatingMode(o3d3xx::Camera::operating_mode::EDIT);
dev->SetActiveApplication(old_active_idx);
cam->SetDeviceConfig(dev.get());
cam->SaveDevice();
cam->DeleteApplication(idx);
return 0;
}