ArMarkerLocalizerOpenCV.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package VisionX::Component
19  * @author David Schiebener (schiebener at kit dot edu)
20  * @date 2015
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
26 
27 #include <Eigen/Core>
28 
29 #include <opencv2/calib3d.hpp>
30 #include <opencv2/core/eigen.hpp>
31 #include <opencv2/highgui.hpp>
32 
33 // IVT
34 #include <SimoxUtility/algorithm/string.h>
35 
40 
42 
46 
47 #include <Calibration/Calibration.h>
48 #include <Calibration/StereoCalibration.h>
49 #include <Image/IplImageAdaptor.h>
50 
51 namespace visionx
52 {
53 
55  std::string prefix) :
57  {
58  }
59 
62  {
65 
66  defs->optional(
67  p.imageProviderName, "img.ImageProviderName", "Name of the image provider to use.");
68  defs->optional(
69  p.referenceFrame, "img.ReferenceFrameName", "Name of the ReferenceFrameName");
70  defs->optional(p.agentName, "img.AgentName", "Name of the agent");
71  defs->optional(p.cameraIndex, "img.cameraIndex", "Camera index. Left = 0, Right = 1, ...");
72 
73  std::string pattern = "[ k3 [, k4, k5, k6 [, s1, s2, s3, s4 ] ] ]";
74  // defs->optional(p.extraDistortionCoeffs, "cam.ExtraDistortionCoeffs",
75  defs->defineOptionalProperty<std::vector<std::string>>(
76  "cam.ExtraDistortionCoeffs",
77  {},
78  "Optional extra distortion coefficients (which cannot be retrieved from the image "
79  "provider)."
80  "\nThe expected parameters are: " +
81  pattern +
82  ""
83  "\nThat is, you must specifiy 1 (k3), 4 (k3-k6), or 8 (k3-k6, s1-s4) elements."
84  "\nNote: k1, k2, p1, p2 are retrieved from the image provider.")
85  .map(pattern, {});
86 
87  defs->defineOptionalProperty<float>(
88  "ar.MarkerSize", p.markerSize.load(), "The side length of the marker(s)");
89  defs->optional(p.dictionary, "ar.Dictionary", "The ArUco dictionary.")
90  .map("4X4_50", cv::aruco::DICT_4X4_50)
91  .map("4X4_100", cv::aruco::DICT_4X4_100)
92  .map("4X4_250", cv::aruco::DICT_4X4_250)
93  .map("4X4_1000", cv::aruco::DICT_4X4_1000)
94  .map("5X5_50", cv::aruco::DICT_5X5_50)
95  .map("5X5_100", cv::aruco::DICT_5X5_100)
96  .map("5X5_250", cv::aruco::DICT_5X5_250)
97  .map("5X5_1000", cv::aruco::DICT_5X5_1000)
98  .map("6X6_50", cv::aruco::DICT_6X6_50)
99  .map("6X6_100", cv::aruco::DICT_6X6_100)
100  .map("6X6_250", cv::aruco::DICT_6X6_250)
101  .map("6X6_1000", cv::aruco::DICT_6X6_1000)
102  .map("7X7_50", cv::aruco::DICT_7X7_50)
103  .map("7X7_100", cv::aruco::DICT_7X7_100)
104  .map("7X7_250", cv::aruco::DICT_7X7_250)
105  .map("7X7_1000", cv::aruco::DICT_7X7_1000)
106  .map("ARUCO_ORIGINAL", cv::aruco::DICT_ARUCO_ORIGINAL);
107 
108  defs->defineOptionalProperty<std::string>("ar.MarkerGeneration",
109  "https://chev.me/arucogen/",
110  "You can generate ArUco markers here.");
111 
112  defs->defineOptionalProperty<bool>(
113  "visu.Enabled", p.visuEnabled.load(), "If true, visualize marker poses.");
114 
115  return defs;
116  }
117 
119  {
120  addPlugin(virtualRobotReaderPlugin);
121  }
122 
123  std::string
125  {
126  return "ArMarkerLocalizerOpenCV";
127  }
128 
129  void
131  {
132  ARMARX_INFO << VAROUT(p.dictionary);
133  *arucoDictionary = cv::aruco::getPredefinedDictionary(p.dictionary);
134  p.markerSize = getProperty<float>("ar.MarkerSize").getValue();
135  ARMARX_INFO << VAROUT(p.markerSize);
136 
137  p.visuEnabled = getProperty<bool>("visu.Enabled").getValue();
138 
139  {
140  std::string propName = "cam.ExtraDistortionCoeffs";
141  std::vector<std::string> coeffsStr;
142  getProperty(coeffsStr, "cam.ExtraDistortionCoeffs");
143 
144  p.extraDistortionCoeffs.clear();
145  for (const auto& coeffStr : coeffsStr)
146  {
147  try
148  {
149  p.extraDistortionCoeffs.push_back(std::stof(coeffStr));
150  }
151  catch (const std::invalid_argument&)
152  {
153  ARMARX_WARNING << "Could not parse '" << coeffStr << "' as float in property "
154  << propName << "." << "\nIgnoring extra parameters.";
155  p.extraDistortionCoeffs.clear();
156  break;
157  }
158  }
159  }
160  }
161 
162  void
164  {
165  ARMARX_CHECK_NOT_NULL(virtualRobotReaderPlugin);
166 
167  robot = virtualRobotReaderPlugin->get().getRobot(p.agentName);
168  ARMARX_CHECK_NOT_NULL(robot) << p.agentName;
169 
170  referenceNode = robot->getRobotNode(p.referenceFrame);
171  ARMARX_CHECK_NOT_NULL(referenceNode) << p.referenceFrame;
172 
173  ARMARX_VERBOSE << "Marker size: " << p.markerSize;
174 
175  visionx::ImageProviderInfo imageProviderInfo = getImageProvider(p.imageProviderName);
176  StereoCalibrationInterfacePrx calibrationProvider =
177  StereoCalibrationInterfacePrx::checkedCast(imageProviderInfo.proxy);
178 
179  std::unique_ptr<CStereoCalibration> stereoCalibration(
180  visionx::tools::convert(calibrationProvider->getStereoCalibration()));
181  CCalibration::CCameraParameters ivtCameraParameters =
182  stereoCalibration->GetLeftCalibration()->GetCameraParameters();
183 
184  this->cameraMatrix = visionx::makeCameraMatrix(ivtCameraParameters);
185  ARMARX_VERBOSE << "Camera matrix: \n" << this->cameraMatrix;
186 
187  {
188  // "Vector of distortion coefficients (k1,k2,p1,p2 [,k3 [,k4,k5,k6], [s1,s2,s3,s4]]) of 4, 5, 8 or 12 elements"
189  // Source: https://docs.opencv.org/3.2.0/d9/d6a/group__aruco.html#ga7da45d2e8139504f3a532d884b4fb4ac
190 
191  std::set<int> allowedSizes = {4, 5, 8, 12};
192  ARMARX_VERBOSE << "Got " << p.extraDistortionCoeffs.size()
193  << " extra distortion coefficients.";
194 
195  int num = int(4 + p.extraDistortionCoeffs.size());
196  ARMARX_CHECK_POSITIVE(allowedSizes.count(num))
197  << "Allowed sizes: "
198  << simox::alg::join(
199  simox::alg::multi_to_string(allowedSizes.begin(), allowedSizes.end()), " ")
200  << "\n num = " << num << " = 4 + " << p.extraDistortionCoeffs.size()
201  << " = 4 + #extra coeffs";
202 
203  cv::Mat distortionParameters(num, 1, cv::DataType<float>::type);
204 
205  if (!calibrationProvider->getImagesAreUndistorted())
206  {
207  // k1, k2, p1, p2
208  for (int i = 0; i < 4; ++i)
209  {
210  distortionParameters.at<float>(i, 0) = ivtCameraParameters.distortion[i];
211  }
212  // extra
213  for (int i = 0; size_t(i) < p.extraDistortionCoeffs.size(); ++i)
214  {
215  distortionParameters.at<float>(4 + i, 0) =
216  p.extraDistortionCoeffs.at(size_t(i));
217  }
218  }
219  else
220  {
221  for (int i = 0; i < distortionParameters.rows; ++i)
222  {
223  distortionParameters.at<float>(i, 0) = 0;
224  }
225  }
226 
227  this->distortionCoeffs = distortionParameters;
228  ARMARX_CHECK_POSITIVE(allowedSizes.count(this->distortionCoeffs.rows));
229  }
230  ARMARX_VERBOSE << "Distortion coefficients: \n" << this->distortionCoeffs;
231 
232 
233  cameraImages = new CByteImage*[2];
234 
235  cameraImages[0] = tools::createByteImage(imageProviderInfo);
236  cameraImages[1] = tools::createByteImage(imageProviderInfo);
237 
240  }
241 
242  void
244  {
245  if (waitForImages(500))
246  {
247  armarx::MetaInfoSizeBasePtr info;
248  getImages(p.imageProviderName, cameraImages, info);
249  m_timestamp_last_image = armarx::DateTime(armarx::Duration::MicroSeconds(info->timeProvided));
250 
251  // getImages(cameraImages);
252  }
253  else
254  {
255  ARMARX_VERBOSE << "Timeout or error in wait for images.";
256  return;
257  }
258 
259  ArMarkerLocalizationResultList result = localizeAllMarkersInternal();
260  {
261  std::unique_lock lock(resultMutex);
262  lastLocalizationResult = result;
263  // m_timestamp_last_result = m_timestamp_last_image;
264  }
265 
266  {
267  armarx::viz::Layer layer = arviz.layer("Marker Poses");
268  if (p.visuEnabled)
269  {
270  const Eigen::Isometry3f global_T_frame{referenceNode->getGlobalPose()};
271 
272  for (const auto& r : result)
273  {
274  const Eigen::Isometry3f frame_T_marker{
275  armarx::FramedPosePtr::dynamicCast(r.pose)->toEigen()};
276  const Eigen::Isometry3f global_T_marker = global_T_frame * frame_T_marker;
277 
278  layer.add(
279  armarx::viz::Pose(std::to_string(r.id)).pose(global_T_marker.matrix()));
280  }
281  }
282  arviz.commit({layer});
283  }
284  }
285 
286  ArMarkerLocalizationResultList
287  ArMarkerLocalizerOpenCV::localizeAllMarkersInternal()
288  {
289  ARMARX_TRACE;
290  ARMARX_CHECK(
291  virtualRobotReaderPlugin->get().synchronizeRobot(*robot, armarx::Clock::Now()));
292 
293  cameraImages[0]->bytesPerPixel = 3;
294  cameraImages[1]->bytesPerPixel = 3;
295 
296  IplImage* imageIpl = IplImageAdaptor::Adapt(cameraImages[p.cameraIndex]);
297  cv::Mat imageOpenCV = cv::cvarrToMat(imageIpl);
298 
299  // cv::imshow("Input", imageOpenCV);
300  // cv::waitKey(10);
301 
302  // Detect markers in image.
303 
304  ARMARX_DEBUG << "Calling marker detection";
305 
306  std::vector<int> markerIDs;
307  std::vector<std::vector<cv::Point2f>> markerCorners;
308  cv::aruco::detectMarkers(
309  imageOpenCV, arucoDictionary, markerCorners, markerIDs, arucoParameters);
310 
311 
312  ARMARX_CHECK_EQUAL(markerIDs.size(), markerCorners.size());
313 
314  ARMARX_VERBOSE << "Localized " << markerIDs.size() << " markers: "
315  << simox::alg::join(simox::alg::multi_to_string(markerIDs), " ");
316 
317  // We could draw an visu image:
318  cv::Mat outputImage = imageOpenCV.clone();
319  if (not markerIDs.empty())
320  {
321  cv::aruco::drawDetectedMarkers(outputImage, markerCorners, markerIDs);
322  }
323  // cv::aruco::drawDetectedMarkers(imageOpenCV, markerCorners, markerIDs);
324 
325 
326  // Estimate marker poses.
327  ARMARX_DEBUG << "Estimating marker poses.";
328 
329  std::vector<cv::Vec3d> rvecs, tvecs;
330  cv::aruco::estimatePoseSingleMarkers(
331  markerCorners, p.markerSize, cameraMatrix, distortionCoeffs, rvecs, tvecs);
332  ARMARX_CHECK_EQUAL(rvecs.size(), markerCorners.size());
333  ARMARX_CHECK_EQUAL(tvecs.size(), markerCorners.size());
334  ARMARX_VERBOSE << "Estimated " << rvecs.size() << " marker poses.";
335 
336  // Assemble results
337 
338  visionx::ArMarkerLocalizationResultList resultList;
339 
340  for (size_t i = 0; i < markerIDs.size(); ++i)
341  {
342  visionx::ArMarkerLocalizationResult& result = resultList.emplace_back();
343 
344  const cv::Vec3d& tvec = tvecs.at(i);
345  Eigen::Vector3f position = Eigen::Vector3d(tvec(0), tvec(1), tvec(2)).cast<float>();
346 
347  cv::Mat cvOrientation;
348  try
349  {
350  cv::Rodrigues(rvecs.at(i), cvOrientation);
351  }
352  catch (const std::exception& e)
353  {
354  ARMARX_ERROR << "Caught exception when running cv::aruco::Rodrigues(): \n"
355  << e.what();
356  return {};
357  }
358  ARMARX_CHECK_EQUAL(cvOrientation.rows, 3);
359  ARMARX_CHECK_EQUAL(cvOrientation.cols, 3);
360 
361  Eigen::Matrix3d orientation;
362  cv::cv2eigen(cvOrientation, orientation);
363 
364  result.pose = new armarx::FramedPose(
365  orientation.cast<float>(), position, p.referenceFrame, p.agentName);
366  result.id = markerIDs.at(i);
367 
368  armarx::core::time::toIce(result.timestamp, m_timestamp_last_image);
369 
370  cv::drawFrameAxes(outputImage, cameraMatrix, distortionCoeffs, rvecs[i], tvecs[i], 0.1);
371  }
372 
373  CByteImage* output_cimage =
374  new CByteImage(outputImage.size[0], outputImage.size[1], CByteImage::ImageType::eRGB24);
375  copyCvMatToIVT(outputImage, output_cimage);
376 
377  CByteImage* result_images[2] = {cameraImages[0], output_cimage};
378  provideResultImages(result_images);
379  delete output_cimage;
380  return resultList;
381  }
382 
383  visionx::ArMarkerLocalizationResultList
385  {
386  if (waitForImages(500))
387  {
388  getImages(cameraImages);
389  return localizeAllMarkersInternal();
390  }
391  else
392  {
393  ARMARX_WARNING << "No new Images available!";
394  return {};
395  }
396  }
397 
398  ArMarkerLocalizationResultList
400  {
401  std::unique_lock lock(resultMutex);
402  return lastLocalizationResult;
403  }
404 
405  void
407  {
408  using namespace armarx::RemoteGui::Client;
409 
410  GridLayout grid;
411  int row = 0;
412 
413  tab.markerSize.setRange(1.0, 1000.0);
414  tab.markerSize.setSteps(1000);
415  tab.markerSize.setDecimals(1);
416  tab.markerSize.setValue(p.markerSize);
417 
418  tab.visuEnabled.setValue(p.visuEnabled);
419 
420  grid.add(Label("Marker size:"), {row, 0}).add(tab.markerSize, {row, 1});
421  row++;
422  grid.add(Label("Enable visu:"), {row, 0}).add(tab.visuEnabled, {row, 1});
423  row++;
424 
425  VBoxLayout root = {grid, VSpacer()};
426  RemoteGui_createTab(getName(), root, &tab);
427  }
428 
429  void
431  {
432  if (tab.markerSize.hasValueChanged())
433  {
434  p.markerSize = tab.markerSize.getValue();
435  }
436  if (tab.visuEnabled.hasValueChanged())
437  {
438  p.visuEnabled = tab.visuEnabled.getValue();
439  }
440  }
441 
442 } // namespace visionx
visionx::ArMarkerLocalizerOpenCV::onInitImageProcessor
void onInitImageProcessor() override
Setup the vision component.
Definition: ArMarkerLocalizerOpenCV.cpp:130
visionx::ArMarkerLocalizerOpenCV::getDefaultName
std::string getDefaultName() const override
Definition: ArMarkerLocalizerOpenCV.cpp:124
armarx::viz::Client::commit
CommitResult commit(StagedCommit const &commit)
Definition: Client.cpp:80
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:180
visionx::ArMarkerLocalizerOpenCV::createRemoteGuiTab
void createRemoteGuiTab()
Definition: ArMarkerLocalizerOpenCV.cpp:406
visionx
ArmarX headers.
Definition: OpenPoseStressTest.h:38
visionx::ArMarkerLocalizerOpenCVPropertyDefinitions
Definition: ArMarkerLocalizerOpenCV.h:51
visionx::ArMarkerLocalizerOpenCV::RemoteGui_update
void RemoteGui_update() override
Definition: ArMarkerLocalizerOpenCV.cpp:430
armarx::VariantType::FramedPose
const VariantTypeId FramedPose
Definition: FramedPose.h:37
visionx::ArMarkerLocalizerOpenCV::process
void process() override
Process the vision component.
Definition: ArMarkerLocalizerOpenCV.cpp:243
armarx::RemoteGui::Client::VBoxLayout
Definition: Widgets.h:167
DateTime.h
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::RemoteGui::Client::GridLayout::add
GridLayout & add(Widget const &child, Pos pos, Span span=Span{1, 1})
Definition: Widgets.cpp:412
armarx::core::time::toIce
void toIce(dto::ClockType::ClockTypeEnum &dto, const ClockType &bo)
Definition: ice_conversions.cpp:33
visionx::ImageProcessor::getImageProvider
ImageProviderInfo getImageProvider(std::string name, ImageType destinationImageType=eRgb, bool waitForProxy=false)
Select an ImageProvider.
Definition: ImageProcessor.cpp:152
visionx::ArMarkerLocalizerOpenCV::LocalizeAllMarkersNow
visionx::ArMarkerLocalizationResultList LocalizeAllMarkersNow(const Ice::Current &) override
Definition: ArMarkerLocalizerOpenCV.cpp:384
visionx::ArMarkerLocalizerOpenCV::createPropertyDefinitions
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
Definition: ArMarkerLocalizerOpenCV.cpp:61
ice_conversions.h
armarx::ManagedIceObject::addPlugin
PluginT * addPlugin(const std::string prefix="", ParamsT &&...params)
Definition: ManagedIceObject.h:182
armarx::viz::Layer::add
void add(ElementT const &element)
Definition: Layer.h:29
armarx::RemoteGui::Client::VSpacer
Definition: Widgets.h:204
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
visionx::tools::createByteImage
CByteImage * createByteImage(const ImageFormatInfo &imageFormat, const ImageType imageType)
Creates a ByteImage for the destination type specified in the given imageProviderInfo.
Clock.h
visionx::ArMarkerLocalizerOpenCV::onConnectImageProcessor
void onConnectImageProcessor() override
Implement this method in the ImageProcessor in order execute parts when the component is fully initia...
Definition: ArMarkerLocalizerOpenCV.cpp:163
visionx::ImageProviderInfo
Definition: ImageProcessor.h:466
visionx::tools::convert
CByteImage::ImageType convert(const ImageType visionxImageType)
Converts a VisionX image type into an image type of IVT's ByteImage.
Definition: TypeMapping.cpp:95
ArMarkerLocalizerOpenCV.h
visionx::voxelgrid::Label
uint32_t Label
Type of an object label.
Definition: types.h:7
armarx::RemoteGui::Client::GridLayout
Definition: Widgets.h:186
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:69
FramedPose.h
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
GfxTL::Vec3d
VectorXD< 3, double > Vec3d
Definition: VectorXD.h:695
armarx::conversions::cv2eigen
Eigen::Vector2f cv2eigen(const cv::Point2f &pt)
Definition: opencv_eigen.h:47
visionx::ArMarkerLocalizerOpenCV::GetLatestLocalizationResult
visionx::ArMarkerLocalizationResultList GetLatestLocalizationResult(const Ice::Current &) override
Definition: ArMarkerLocalizerOpenCV.cpp:399
armarx::viz::Pose
Definition: Elements.h:179
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:189
visionx::ImageProcessor::getImages
int getImages(CByteImage **ppImages)
Poll images from provider.
Definition: ImageProcessor.cpp:351
ARMARX_CHECK_POSITIVE
#define ARMARX_CHECK_POSITIVE(number)
This macro evaluates whether number is positive (> 0) and if it turns out to be false it will throw a...
Definition: ExpressionException.h:145
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:40
armarx::LightweightRemoteGuiComponentPluginUser::RemoteGui_startRunningTask
void RemoteGui_startRunningTask()
Definition: LightweightRemoteGuiComponentPlugin.cpp:110
ExpressionException.h
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::Component::getConfigIdentifier
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition: Component.cpp:74
visionx::copyCvMatToIVT
void copyCvMatToIVT(cv::Mat const &input, CByteImage *output)
Copies the contents of an OpenCV matrix to an IVT CByteImage.
Definition: OpenCVUtil.cpp:13
visionx::ImageProviderInfo::proxy
ImageProviderInterfacePrx proxy
proxy to image provider
Definition: ImageProcessor.h:472
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
armarx::viz::ElementOps::pose
DerivedT & pose(Eigen::Matrix4f const &pose)
Definition: ElementOps.h:159
armarx::ArVizComponentPluginUser::arviz
armarx::viz::Client arviz
Definition: ArVizComponentPlugin.h:43
armarx::PropertyUser::getProperty
Property< PropertyType > getProperty(const std::string &name)
Property creation and retrieval.
Definition: PropertyUser.h:179
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:182
armarx::LightweightRemoteGuiComponentPluginUser::RemoteGui_createTab
void RemoteGui_createTab(std::string const &name, RemoteGui::Client::Widget const &rootWidget, RemoteGui::Client::Tab *tab)
Definition: LightweightRemoteGuiComponentPlugin.cpp:95
IceUtil::Handle< class PropertyDefinitionContainer >
OpenCVUtil.h
visionx::ImageProcessorPropertyDefinitions
Definition: ImageProcessor.h:61
ImageUtil.h
visionx::ImageProcessor::provideResultImages
void provideResultImages(CByteImage **images, armarx::MetaInfoSizeBasePtr info=nullptr)
sends result images for visualization
Definition: ImageProcessor.cpp:245
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:97
armarx::ManagedIceObject::getName
std::string getName() const
Retrieve name of object.
Definition: ManagedIceObject.cpp:107
TypeMapping.h
visionx::makeCameraMatrix
cv::Mat makeCameraMatrix(const visionx::CameraParameters &cameraParams)
Definition: opencv_conversions.cpp:25
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::viz::Client::layer
Layer layer(std::string const &name) const
Definition: Client.cpp:73
armarx::core::time::Duration::MicroSeconds
static Duration MicroSeconds(std::int64_t microSeconds)
Constructs a duration in microseconds.
Definition: Duration.cpp:27
armarx::RemoteGui::Client
Definition: EigenWidgets.cpp:8
armarx::viz::Layer
Definition: Layer.h:12
visionx::ArMarkerLocalizerOpenCV::ArMarkerLocalizerOpenCV
ArMarkerLocalizerOpenCV()
Definition: ArMarkerLocalizerOpenCV.cpp:118
visionx::ArMarkerLocalizerOpenCVPropertyDefinitions::ArMarkerLocalizerOpenCVPropertyDefinitions
ArMarkerLocalizerOpenCVPropertyDefinitions(std::string prefix)
Definition: ArMarkerLocalizerOpenCV.cpp:54
visionx::ImageProcessor::waitForImages
bool waitForImages(int milliseconds=1000)
Wait for new images.
Definition: ImageProcessor.cpp:275