34 numImages = getProperty<int>(
"numImages").getValue();
35 height = getProperty<int>(
"height").getValue();
36 width = getProperty<int>(
"width").getValue();
38 colorMask = getProperty<Eigen::Vector3i>(
"colorMask").getValue();
40 ARMARX_INFO <<
"color mask is r:" << colorMask(0) <<
" g:" << colorMask(1)
41 <<
" b:" << colorMask(2);
43 setImageFormat(visionx::ImageDimension(width, height), visionx::eRgb);
44 setNumberImages(numImages);
46 bytesPerPixel = getImageFormat().bytesPerPixel;
60 pollImagesTask->start();
62 if (imageSources.size() == 0)
64 std::vector<std::string> imageProviders =
65 getProperty<std::vector<std::string>>(
"imageProviders").getValue();
66 setResultImageProviders(imageProviders);
73 pollImagesTask->stop();
81 const size_t imageSize = width * height * bytesPerPixel;
84 bool imageCaptured =
false;
86 for (
auto& any : imageSources)
89 std::string proxyName = any.first;
91 if (!imageAvailable[proxyName])
97 imageAvailable[proxyName] =
false;
100 ImageProviderInterfacePrx providerPrx;
104 providerPrx = getProxy<ImageProviderInterfacePrx>(proxyName,
false);
108 ARMARX_WARNING <<
"provider" << proxyName <<
" is no longer here.";
113 CByteImage** providerImages = any.second;
114 for (
int n = 0; n < numImages; n++)
116 CByteImage* image = providerImages[n];
118 for (
int j = 0; j < height; j++)
120 for (
int i = 0; i < width; i++)
123 int r = image->pixels[3 * (j * width + i) + 0];
124 int g = image->pixels[3 * (j * width + i) + 1];
125 int b = image->pixels[3 * (j * width + i) + 2];
127 if (!(r == colorMask(0) && g == colorMask(1) && b == colorMask(2)))
129 resultImage->pixels[3 * (j * width + i) + 0] = r;
130 resultImage->pixels[3 * (j * width + i) + 1] = g;
131 resultImage->pixels[3 * (j * width + i) + 2] = b;
137 imageCaptured =
true;
143 for (
int i = 0; i < numImages; i++)
145 memcpy(ppImages[i], resultImage->pixels, imageSize);
149 return imageCaptured;
153 ResultImageFuser::setResultImageProviders(std::vector<std::string> imageProviders)
155 imageSources.clear();
158 for (std::string& proxyName : imageProviders)
161 ImageProviderInterfacePrx providerPrx;
165 providerPrx = getProxy<ImageProviderInterfacePrx>(proxyName,
false);
169 ARMARX_WARNING <<
"provider" << proxyName <<
" is no longer here.";
173 const int providerNumImages = providerPrx->getNumberImages();
174 ImageFormatInfo imageFormat = providerPrx->getImageFormat();
176 assert(imageFormat.dimension.width == width);
177 assert(imageFormat.dimension.height == height);
178 assert(imageFormat.bytesPerPixel == bytesPerPixel);
179 assert(numImages <= providerNumImages);
181 CByteImage** images =
new CByteImage*[providerNumImages];
183 for (
int n = 0; n < numImages; n++)
189 imageSources[proxyName] = images;
190 imageAvailable[proxyName] =
false;
195 ResultImageFuser::pollImageProviders()
197 std::unique_lock lock(imageMutex);
199 for (
auto& any : imageSources)
201 std::string proxyName = any.first;
203 ImageProviderInterfacePrx providerPrx;
207 providerPrx = getProxy<ImageProviderInterfacePrx>(proxyName,
false);
211 ARMARX_WARNING <<
"provider" << proxyName <<
" is no longer here.";
215 CByteImage** bufferImages = any.second;
216 ImageFormatInfo imageFormat = providerPrx->getImageFormat();
218 armarx::Blob images = providerPrx->getImages();
220 size_t imageSize = width * height * imageFormat.bytesPerPixel;
222 for (
int i = 0; i < numImages; i++)
224 memcpy(bufferImages[i]->pixels, &images[imageSize * i], imageSize);
227 imageAvailable[proxyName] =
true;