Mech-Eye API 2.3.1
API reference documentation for Mech-Eye Industrial 3D Camera
All Classes Functions Variables Enumerations Enumerator Pages
api_util.h
1/*******************************************************************************
2 *BSD 3-Clause License
3 *
4 *Copyright (c) 2016-2024, Mech-Mind Robotics
5 *All rights reserved.
6 *
7 *Redistribution and use in source and binary forms, with or without
8 *modification, are permitted provided that the following conditions are met:
9 *
10 *1. Redistributions of source code must retain the above copyright notice, this
11 * list of conditions and the following disclaimer.
12 *
13 *2. Redistributions in binary form must reproduce the above copyright notice,
14 * this list of conditions and the following disclaimer in the documentation
15 * and/or other materials provided with the distribution.
16 *
17 *3. Neither the name of the copyright holder nor the names of its
18 * contributors may be used to endorse or promote products derived from
19 * this software without specific prior written permission.
20 *
21 *THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 *DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 *DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 *SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 *CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 *OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 *OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 ******************************************************************************/
32
33#pragma once
34#include <iostream>
35#include <set>
36#include <utility>
37#include <regex>
38#include "CameraProperties.h"
39#include "ErrorStatus.h"
40#include "CommonTypes.h"
41#include "Camera.h"
42
43inline void printCameraInfo(const mmind::eye::CameraInfo& cameraInfo)
44{
45 std::cout << "............................." << std::endl;
46 std::cout << "Camera Model Name: " << cameraInfo.model << std::endl;
47 std::cout << "Camera Serial Number: " << cameraInfo.serialNumber << std::endl;
48 std::cout << "Camera IP Address: " << cameraInfo.ipAddress << std::endl;
49 std::cout << "Camera Subnet Mask: " << cameraInfo.subnetMask << std::endl;
50 std::cout << "Camera IP Assignment Method: "
51 << mmind::eye::ipAssignmentMethodToString(cameraInfo.ipAssignmentMethod) << std::endl;
52 std::cout << "Hardware Version: "
53 << "V" << cameraInfo.hardwareVersion.toString() << std::endl;
54 std::cout << "Firmware Version: "
55 << "V" << cameraInfo.firmwareVersion.toString() << std::endl;
56 std::cout << "............................." << std::endl;
57 std::cout << std::endl;
58}
59
60inline void printCameraStatus(const mmind::eye::CameraStatus& cameraStatus)
61{
62 std::cout << ".....Camera Temperature....." << std::endl;
63 std::cout << "CPU : " << cameraStatus.temperature.cpuTemperature << "°C"
64 << std::endl;
65 std::cout << "Projector Module: " << cameraStatus.temperature.projectorTemperature << "°C"
66 << std::endl;
67 std::cout << "............................" << std::endl;
68
69 std::cout << std::endl;
70}
71
72inline void printCameraResolutions(const mmind::eye::CameraResolutions& cameraResolutions)
73
74{
75 std::cout << "Texture Map size : (width : " << cameraResolutions.texture.width
76 << ", height : " << cameraResolutions.texture.height << ")." << std::endl;
77 std::cout << "Depth Map size : (width : " << cameraResolutions.depth.width
78 << ", height : " << cameraResolutions.depth.height << ")." << std::endl;
79}
80
81inline void printCameraMatrix(const std::string& title,
82 const mmind::eye::CameraMatrix& cameraMatrix)
83{
84 std::cout << title << ": " << std::endl
85 << " [" << cameraMatrix.fx << ", " << 0 << ", " << cameraMatrix.cx << "]"
86
87 << std::endl
88 << " [" << 0 << ", " << cameraMatrix.fy << ", " << cameraMatrix.cy << "]"
89
90 << std::endl
91 << " [" << 0 << ", " << 0 << ", " << 1 << "]" << std::endl;
92 std::cout << std::endl;
93}
94
95inline void printCameraDistCoeffs(const std::string& title,
96 const mmind::eye::CameraDistortion& distCoeffs)
97{
98 std::cout << title << ": " << std::endl
99 << " k1: " << distCoeffs.k1 << ", k2: " << distCoeffs.k2
100 << ", p1: " << distCoeffs.p1 << ", p2: " << distCoeffs.p2 << ", k3: " << distCoeffs.k3
101 << std::endl;
102 std::cout << std::endl;
103}
104
105inline void printTransform(const std::string& title, const mmind::eye::Transformation& transform)
106{
107 std::cout << "Rotation: " << title << ": " << std::endl;
108 for (int i = 0; i < 3; i++) {
109 std::cout << " [";
110 for (int j = 0; j < 3; j++) {
111 std::cout << transform.rotation[i][j];
112 if (j != 2)
113 std::cout << ", ";
114 }
115 std::cout << "]" << std::endl;
116 }
117 std::cout << std::endl;
118 std::cout << "Translation " << title << ": " << std::endl;
119 std::cout << " X: " << transform.translation[0] << "mm, Y: " << transform.translation[1]
120 << "mm, Z: " << transform.translation[2] << "mm" << std::endl;
121 std::cout << std::endl;
122}
123
124inline void printCameraIntrinsics(const mmind::eye::CameraIntrinsics& intrinsics)
125{
126 printCameraMatrix("Texture Camera Matrix", intrinsics.texture.cameraMatrix);
127 printCameraDistCoeffs("Texture Camera Distortion Coefficients",
128 intrinsics.texture.cameraDistortion);
129
130 printCameraMatrix("Depth Camera Matrix", intrinsics.depth.cameraMatrix);
131 printCameraDistCoeffs("Depth Camera Distortion Coefficients",
132 intrinsics.depth.cameraDistortion);
133
134 printTransform("From Depth Camera to Texture Camera", intrinsics.depthToTexture);
135}
136
137inline bool findAndConnect(mmind::eye::Camera& device)
138{
139 std::cout << "Find Mech-Eye Industrial 3D Cameras..." << std::endl;
140 std::vector<mmind::eye::CameraInfo> deviceInfoList = mmind::eye::Camera::discoverCameras();
141
142 if (deviceInfoList.empty()) {
143 std::cout << "No Mech-Eye Industrial 3D Cameras found." << std::endl;
144 return false;
145 }
146
147 for (int i = 0; i < deviceInfoList.size(); i++) {
148 std::cout << "Mech-Eye device index : " << i << std::endl;
149 printCameraInfo(deviceInfoList[i]);
150 }
151
152 std::cout << "Please enter the device index you want to connect: ";
153 unsigned inputIndex = 0;
154
155 while (true) {
156 std::string str;
157 std::cin >> str;
158 if (std::regex_match(str.begin(), str.end(), std::regex{"[0-9]+"}) &&
159 atoi(str.c_str()) < deviceInfoList.size()) {
160 inputIndex = atoi(str.c_str());
161 break;
162 }
163 std::cout << "Input invalid. Please enter the device index you want to connect: ";
164 }
165
167 status = device.connect(deviceInfoList[inputIndex]);
168
169 if (!status.isOK()) {
170 showError(status);
171 return false;
172 }
173
174 std::cout << "Connect Mech-Eye Industrial 3D Camera Successfully." << std::endl;
175 return true;
176}
177
178inline std::vector<mmind::eye::Camera> findAndConnectMultiCamera()
179{
180 std::cout << "Find Mech-Eye Industrial 3D Cameras..." << std::endl;
181 std::vector<mmind::eye::CameraInfo> cameraInfoList = mmind::eye::Camera::discoverCameras();
182
183 if (cameraInfoList.empty()) {
184 std::cout << "No Mech-Eye Industrial 3D Cameras found." << std::endl;
185 return {};
186 }
187
188 for (int i = 0; i < cameraInfoList.size(); i++) {
189 std::cout << "Mech-Eye device index : " << i << std::endl;
190 printCameraInfo(cameraInfoList[i]);
191 }
192
193 std::string str;
194 std::set<unsigned> indices;
195
196 while (true) {
197 std::cout << "Please enter the device index you want to connect: " << std::endl;
198 std::cout << "Enter the character 'c' to terminate adding devices" << std::endl;
199
200 std::cin >> str;
201 if (str == "c")
202 break;
203 if (std::regex_match(str.begin(), str.end(), std::regex{"[0-9]+"}) &&
204 atoi(str.c_str()) < cameraInfoList.size())
205 indices.insert(atoi(str.c_str()));
206 else
207 std::cout << "Input invalid. Please enter the device index you want to connect: ";
208 }
209
210 std::vector<mmind::eye::Camera> cameraList{};
211
212 auto iter = indices.cbegin();
213 for (int i = 0; i < indices.size(); ++i, ++iter) {
214 mmind::eye::Camera camera;
215 auto status = camera.connect(cameraInfoList[*iter]);
216 if (status.isOK())
217 cameraList.push_back(camera);
218 else
219 showError(status);
220 }
221
222 return cameraList;
223}
224
225inline bool confirmCapture3D()
226{
227 std::cout << "Do you want the camera to capture 3D image ? Please input y/n to confirm: "
228 << std::endl;
229 while (true) {
230 std::string confirmStr;
231 std::cin >> confirmStr;
232 if (confirmStr == "y") {
233 return true;
234 } else if (confirmStr == "n") {
235 std::cout << "program ends!" << std::endl;
236 return false;
237 } else {
238 std::cout << "Please input y/n again!" << std::endl;
239 }
240 }
241}
Operates the Mech-Eye Industrial 3D Cameras. Use Camera::connect to connect an available camera,...
Definition Camera.h:55
static std::vector< CameraInfo > discoverCameras()
Discovers all available cameras, and returns the camera information list for them....
ErrorStatus connect(const CameraInfo &info, unsigned int timeoutMs=5000)
Connects to a camera via CameraInfo.
std::string toString() const
Converts a Version object to a string of Version.
Definition Version.h:71
Describes the distortion parameters.
double k1
Radial distortion coefficients.
double k3
Radial distortion coefficients.
double p2
Tangential distortion coefficients.
double k2
Radial distortion coefficients.
double p1
Tangential distortion coefficients.
Defines the camera information.
IpAssignmentMethod ipAssignmentMethod
The IP assignment method of the device.
std::string serialNumber
Device serial number.
Version hardwareVersion
The version of the hardware which is pre-determined from the factory.
std::string model
Device model name, such as Mech-Eye Nano.
Version firmwareVersion
The version of the firmware which can be upgraded.
std::string subnetMask
The IP subnet mask of the device.
std::string ipAddress
The IP address of the device.
Defines the 3D camera intrinsic, including the texture source camera, depth source camera and the tra...
Intrinsics2DCamera texture
The intrinsic parameters of the camera for capturing the texture image.
Intrinsics2DCamera depth
The intrinsic parameters of the camera for capturing the depth map.
Describes the camera intrinsic matrix.
double cx
Principal point.
double fy
Focal lengths.
double cy
Principal point.
double fx
Focal lengths.
Defines the camera resolutions information, including texture image resolution and depth map resoluti...
Describes the camera running status.
float projectorTemperature
Projector module temperature in degrees Celsius.
float cpuTemperature
CPU temperature in the device motherboard in degrees Celsius.
Describes the types of errors.
Definition ErrorStatus.h:12
bool isOK() const
Returns true if the operation succeeds.
Definition ErrorStatus.h:70
Defines the rigid body transformations, including rotation matrix and translation vector.
double rotation[3][3]
3*3 rotation matrix.
double translation[3]
3*1 translation vector in [x(mm), y(mm), z(mm)].