39 providerName = getProperty<std::string>(
"providerName").getValue();
40 usingImageProvider(providerName);
42 offeringTopic(getProperty<std::string>(
"DebugObserverName").getValue());
43 frameRate = getProperty<float>(
"Framerate").getValue();
44 thresholdLaplace = getProperty<float>(
"ThresholdLaplaceBlur").getValue();
45 thresholdPerceptual = getProperty<float>(
"ThresholdPerceptualBlur").getValue();
51 std::unique_lock lock(imageMutex);
54 imageProviderPrx = getProxy<visionx::ImageProviderInterfacePrx>(providerName);
56 cameraImages =
new CByteImage*[2];
61 debugObserver = getTopic<DebugObserverInterfacePrx>(
62 getProperty<std::string>(
"DebugObserverName").getValue());
77 std::unique_lock lock(imageMutex);
79 if (!waitForImages(getProperty<std::string>(
"providerName").getValue(), 1000))
81 ARMARX_WARNING <<
"Timeout while waiting for camera images (>1000ms)";
85 int numImages = getImages(cameraImages);
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])};
128 provideResultImages(resultImages);
132 fpsCounter.assureFPS(frameRate);
144 armarx::BlurrinessMetric::laplaceVarianceBlurrinessMetric(cv::Mat& in)
147 cv::Laplacian(in, out, CV_64F);
150 cv::meanStdDev(out,
mean, variance);
152 return (variance.val[0] * variance.val[0]);
169 armarx::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);
224 armarx::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;