51 std::unique_lock lock(imageMutex);
56 cameraImages =
new CByteImage*[2];
77 std::unique_lock lock(imageMutex);
81 ARMARX_WARNING <<
"Timeout while waiting for camera images (>1000ms)";
94 IplImage* ppIplImages[1] = {IplImageAdaptor::Adapt(cameraImages[0])};
96 cv::Mat image = cv::cvarrToMat(ppIplImages[0]);
99 cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
101 double blurrinessLaplaceVariance = laplaceVarianceBlurrinessMetric(gray_image);
102 double blurrinessPerceptualBlur = blurringPerceptual(gray_image);
103 double blurrinessMarziliano = blurringMarziliano(gray_image);
106 << ((blurrinessLaplaceVariance < thresholdLaplace) ?
"Blurry" :
"Not blurry")
107 <<
" Value: " << blurrinessLaplaceVariance;
109 << ((blurrinessPerceptualBlur > thresholdPerceptual) ?
"Blurry" :
"Not blurry")
110 <<
" Value: " << blurrinessPerceptualBlur;
114 debugValues[
"BlurrinessValueLaplace"] =
new Variant(blurrinessLaplaceVariance);
115 debugValues[
"BlurryLaplace"] =
new Variant((blurrinessLaplaceVariance < thresholdLaplace));
117 debugValues[
"BlurrinessValuePerceptual"] =
new Variant(blurrinessPerceptualBlur);
118 debugValues[
"BlurryPerceptual"] =
new Variant((blurrinessPerceptualBlur > thresholdPerceptual));
120 debugValues[
"BlurrinessValueMarziliano"] =
new Variant(blurrinessMarziliano);
122 debugValues[
"seq"] =
new Variant((
int)seq);
125 debugObserver->setDebugChannel(
"BlurrinessMetric", debugValues);
127 CByteImage* resultImages[1] = {IplImageAdaptor::Adapt(ppIplImages[0])};
132 fpsCounter.assureFPS(frameRate);
144armarx::BlurrinessMetric::laplaceVarianceBlurrinessMetric(cv::Mat& in)
147 cv::Laplacian(in, out, CV_64F);
149 cv::Scalar
mean, variance;
150 cv::meanStdDev(out,
mean, variance);
152 return (variance.val[0] * variance.val[0]);
169armarx::BlurrinessMetric::blurringPerceptual(
const cv::Mat& src)
171 double blur_index = 0;
173 cv::Mat smoothV(src.rows, src.cols, CV_8UC1);
174 cv::Mat smoothH(src.rows, src.cols, CV_8UC1);
175 cv::blur(src, smoothV, cv::Size(1, 9));
176 cv::blur(src, smoothH, cv::Size(9, 1));
179 double difS_V = 0, difS_H = 0, difB_V = 0, difB_H = 0;
180 double somaV = 0, somaH = 0, varV = 0, varH = 0;
182 for (
int i = 0; i < src.rows; ++i)
185 for (
int j = 0; j < src.cols; ++j)
190 difS_V =
abs(src.at<uchar>(i, j) - src.at<uchar>(i - 1, j));
191 difB_V =
abs(smoothV.at<uchar>(i, j) - smoothV.at<uchar>(i - 1, j));
196 difS_H =
abs(src.at<uchar>(i, j) - src.at<uchar>(i, j - 1));
197 difB_H =
abs(smoothH.at<uchar>(i, j) - smoothH.at<uchar>(i, j - 1));
200 varV += cv::max(0.0, difS_V - difB_V);
201 varH += cv::max(0.0, difS_H - difB_H);
207 blur_index = cv::max((somaV - varV) / somaV, (somaH - varH) / somaH);
224armarx::BlurrinessMetric::blurringMarziliano(
const cv::Mat& src)
226 double blur_index = 0;
228 cv::Mat edges(src.rows, src.cols, CV_8UC1);
229 cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
231 cv::GaussianBlur(src, edges, cv::Size(3, 3), 0);
232 cv::morphologyEx(edges, edges, cv::MORPH_OPEN, element);
233 cv::morphologyEx(edges, edges, cv::MORPH_CLOSE, element);
234 cv::Sobel(edges, edges, CV_8UC1, 1, 0);
236 unsigned int edge_counter = 0;
246 for (
int i = 0; i < src.rows; ++i)
248 for (
int j = 0; j < src.cols; ++j)
254 if (edges.at<uchar>(i, j) > 0)
266 if ((src.at<uchar>(i, j - 1) - src.at<uchar>(i, j)) > 0)
269 max = src.at<uchar>(i, k);
270 while ((
max <= src.at<uchar>(i, k - 1)) && (k > 1))
273 max = src.at<uchar>(i, k);
280 min = src.at<uchar>(i, k);
281 while ((
min >= src.at<uchar>(i, k - 1)) && (k > 1))
284 min = src.at<uchar>(i, k);
291 if (j == (src.cols - 1))
293 c_end = src.cols - 1;
298 if ((src.at<uchar>(i, j + 1) - src.at<uchar>(i, j)) > 0)
301 max = src.at<uchar>(i, k);
302 while (
max <= src.at<uchar>(i, k + 1))
305 max = src.at<uchar>(i, k);
307 if (k == src.cols - 1)
316 min = src.at<uchar>(i, k);
317 while (
min >= src.at<uchar>(i, k + 1))
320 min = src.at<uchar>(i, k);
322 if (k == src.cols - 1)
330 assert((c_end - c_start) >= 0);
331 length += (c_end - c_start);
337 if (edge_counter != 0)
339 blur_index = ((double)length) / edge_counter;
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
void onConnectImageProcessor() override
Implement this method in the ImageProcessor in order execute parts when the component is fully initia...
void onExitImageProcessor() override
Exit the ImapeProcessor component.
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
void process() override
Process the vision component.
void onInitImageProcessor() override
Setup the vision component.
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Property< PropertyType > getProperty(const std::string &name)
void offeringTopic(const std::string &name)
Registers a topic for retrival after initialization.
TopicProxyType getTopic(const std::string &name)
Returns a proxy of the specified topic.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
The Variant class is described here: Variants.
void usingImageProvider(std::string name)
Registers a delayed topic subscription and a delayed provider proxy retrieval which all will be avail...
bool waitForImages(int milliseconds=1000)
Wait for new images.
ImageProviderInfo getImageProvider(std::string name, ImageType destinationImageType=eRgb, bool waitForProxy=false)
Select an ImageProvider.
int getImages(CByteImage **ppImages)
Poll images from provider.
void provideResultImages(CByteImage **images, armarx::MetaInfoSizeBasePtr info=nullptr)
sends result images for visualization
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::optional< float > mean(const boost::circular_buffer< NameValueMap > &buffer, const std::string &key)
std::map< std::string, VariantBasePtr > StringVariantBaseMap
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
std::vector< T > abs(const std::vector< T > &v)
std::vector< T > min(const std::vector< T > &v1, const std::vector< T > &v2)