33 #include <Image/ImageProcessor.h>
41 return "ImageToArMem";
50 defs->topic(debugObserver);
52 defs->optional(p.imageProviderName,
"img.ProviderName",
"Name of the image provier.");
53 defs->optional(p.providerSegmentName,
54 "img.ProviderSegmentName",
55 "The provider (segment) name (if not specified in the entity ID).\n"
56 "If '(auto)', the image provider name is used.");
58 defs->optional(p.clearProviderSegmentWhenExists,
59 "mem.ClearProviderSegmentsWhenExisting",
60 "If true, the provider segments are cleared when this component starts.");
62 defs->optional(p.commitCameraCalib,
63 "mem.commitCameraCalibration",
64 "Commit camera calibration to memory");
66 p.images.define(*defs);
75 if (p.providerSegmentName ==
"(auto)")
77 p.providerSegmentName = p.imageProviderName;
79 p.images.read(*
this, p.providerSegmentName);
81 imageToArMem.addImagesRGB(p.images.rgbEntityID, p.images.rgbIndices);
82 imageToArMem.addImagesDepth(p.images.depthEntityID, p.images.depthIndices);
84 ARMARX_INFO <<
"Memory image structure: \n" << imageToArMem.summarizeStructure();
85 ARMARX_VERBOSE <<
"Using image provider '" << p.imageProviderName <<
"'.";
87 usingImageProvider(p.imageProviderName);
95 getProxy(imageProvider, p.imageProviderName);
96 imageProviderInfo = getImageProvider(p.imageProviderName);
99 imageToArMem.initImages(imageProviderInfo.imageFormat);
100 inputImages = imageToArMem.makeCByteImageBuffer();
101 inputImageBuffer.clear();
102 for (CByteImage& img : inputImages)
104 inputImageBuffer.emplace_back(&img);
112 imageToArMem.setWriter(memoryNameSystem().useWriter(imageToArMem.getMemoryID()));
119 imageToArMem.setDebugObserver(debugObserver);
121 imageToArMem.addProviderSegments();
125 if (p.commitCameraCalib)
127 if (visionx::StereoCalibrationProviderInterfacePrx calibrationProvider =
128 visionx::StereoCalibrationProviderInterfacePrx::checkedCast(
129 imageProviderInfo.proxy);
133 <<
"Found stereo camera calibration from StereoCalibrationProviderInterface.";
134 visionx::StereoCalibration stereoCameraCalibration =
135 calibrationProvider->getStereoCalibration();
136 imageToArMem.commitCameraCalibration(stereoCameraCalibration);
138 else if (visionx::StereoCalibrationInterfacePrx pointCloudAndStereoCalibrationProvider =
139 visionx::StereoCalibrationInterfacePrx::checkedCast(
140 imageProviderInfo.proxy);
143 ARMARX_INFO <<
"Found stereo camera calibration from StereoCalibrationInterface.";
144 visionx::StereoCalibration stereoCameraCalibration =
145 calibrationProvider->getStereoCalibration();
146 imageToArMem.commitCameraCalibration(stereoCameraCalibration);
150 ARMARX_INFO <<
"Found monocular camera calibration. Could not cast to stereo "
151 "calibration interface.";
152 visionx::MonocularCalibration monocularCameraCalibration =
155 imageToArMem.commitCameraCalibration(monocularCameraCalibration);
177 if (waitForImages(p.imageProviderName,
static_cast<int>(timeout.
toMilliSeconds())))
180 numImages = getImages(p.imageProviderName, inputImageBuffer.data(), imageMetaInfo);
184 if (numImages ==
static_cast<int>(inputImageBuffer.size()))
187 imageToArMem.useImageBuffers(
188 inputImageBuffer.data(),
189 Time(Duration::MicroSeconds(imageMetaInfo->timeProvided)));
190 imageToArMem.commitImages();
194 ARMARX_ERROR <<
"Received unexpected number of input images. Got " << numImages
195 <<
" instead of " << inputImageBuffer.size() <<
".";
200 ARMARX_WARNING <<
"Timeout while waiting for camera images (> " << timeout <<
").";
208 debugObserver->setDebugChannel(