14#include <mitkTestingMacros.h>
17#include <itksys/SystemTools.hxx>
19#include <opencv2/imgproc.hpp>
20#include <opencv2/imgproc/imgproc_c.h>
21#include <opencv2/imgcodecs.hpp>
25static void GrabCutTestLoadedImage(std::string imagePath, std::string maskPath, std::string resultMaskPath)
28 cv::Mat image = cv::imread(imagePath.c_str());
29 cv::Mat maskImage = cv::imread(maskPath.c_str());
30 cv::Mat resultMaskImage = cv::imread(resultMaskPath.c_str());
33 cv::Mat maskImageGray;
34 cv::cvtColor(maskImage, maskImageGray, CV_RGB2GRAY, 1);
37 cv::Mat resultMaskImageGray;
38 cv::cvtColor(resultMaskImage, resultMaskImageGray, CV_RGB2GRAY, 1);
41 cv::Mat foregroundMask, foregroundPoints;
42 cv::compare(maskImageGray, 250, foregroundMask, cv::CMP_GE);
43 cv::findNonZero(foregroundMask, foregroundPoints);
46 std::vector<itk::Index<2> > foregroundPointsVector;
47 for (
size_t n = 0; n < foregroundPoints.total(); ++n)
50 index.SetElement(0, foregroundPoints.at<cv::Point>(n).x);
51 index.SetElement(1, foregroundPoints.at<cv::Point>(n).y);
52 foregroundPointsVector.push_back(index);
55 mitk::GrabCutOpenCVImageFilter::Pointer grabCutFilter = mitk::GrabCutOpenCVImageFilter::New();
57 int currentImageId = 0;
61 MITK_TEST_CONDITION(grabCutFilter->FilterImage(image),
"Filtering should return true for sucess.")
62 cv::Mat resultMask = grabCutFilter->GetResultMask();
63 MITK_TEST_CONDITION(resultMask.empty(), "Result mask must be empty when no foreground points are set.")
68 std::vector<itk::Index<2> > littleForegroundPointsSet(foregroundPointsVector.begin(), foregroundPointsVector.begin()+3);
69 grabCutFilter->SetModelPoints(littleForegroundPointsSet);
70 grabCutFilter->FilterImage(image, ++currentImageId);
74 for (
unsigned int n = 0; n < 100; ++n)
76 if ( grabCutFilter->GetResultImageId() == currentImageId )
78 resultMask = grabCutFilter->GetResultMask();
81 itksys::SystemTools::Delay(100);
84 MITK_TEST_CONDITION(!resultMask.empty(),
85 "Result mask must not be empty when little ("
86 << littleForegroundPointsSet.size() <<
") foreground points are set.");
91 grabCutFilter->SetModelPoints(foregroundPointsVector);
92 MITK_TEST_CONDITION(grabCutFilter->FilterImage(image, ++currentImageId),
"Filtering should return true for sucess.")
96 for (
unsigned int n = 0; n < 100; ++n)
98 if ( grabCutFilter->GetResultImageId() == currentImageId )
100 resultMask = grabCutFilter->GetResultMask();
103 itksys::SystemTools::Delay(100);
106 MITK_TEST_CONDITION( ! resultMask.empty() && cv::countNonZero(resultMask != resultMaskImageGray) == 0,
107 "Filtered image should match reference image.")
110 MITK_TEST_CONDITION(grabCutFilter->FilterImage(image), "Adding new image should still work.")
117 grabCutFilter->SetUseOnlyRegionAroundModelPoints(image.cols);
118 grabCutFilter->FilterImage(image, ++currentImageId);
122 for (
unsigned int n = 0; n < 100; ++n)
124 if (grabCutFilter->GetResultImageId() == currentImageId)
126 resultMask = grabCutFilter->GetResultMask();
130 itksys::SystemTools::Delay(100);
133 MITK_TEST_CONDITION( ! resultMask.empty() && cv::countNonZero(resultMask != resultMaskImageGray) == 0,
134 "Filtered image with really big region used should match reference image again.")
140 grabCutFilter->SetUseOnlyRegionAroundModelPoints(0);
141 grabCutFilter->FilterImage(image, ++currentImageId);
145 for (
unsigned int n = 0; n < 100; ++n)
147 if (grabCutFilter->GetResultImageId() == currentImageId)
149 resultMask = grabCutFilter->GetResultMask();
153 itksys::SystemTools::Delay(100);
156 cv::Mat nonPropablyBackgroundMask, modelPoints;
157 cv::compare(maskImageGray, 250, nonPropablyBackgroundMask, cv::CMP_GE);
158 cv::findNonZero(nonPropablyBackgroundMask, modelPoints);
159 cv::Rect boundingRect = cv::boundingRect(modelPoints);
161 cv::Mat compareMask(resultMask.rows, resultMask.cols, resultMask.type(), 0.0);
162 resultMaskImageGray(boundingRect).copyTo(compareMask(boundingRect));
164 MITK_TEST_CONDITION( ! resultMask.empty() && cv::countNonZero(resultMask != compareMask) == 0,
165 "Filtered image with region just around the model points used should match reference image again.")
171 MITK_TEST_BEGIN(
"GrabCutOpenCVImageFilter")
173 MITK_TEST_CONDITION_REQUIRED(argc == 4,
"Test needs four command line parameters.")
175 GrabCutTestLoadedImage(argv[1], argv[2], argv[3]);
int mitkGrabCutOpenCVImageFilterTest(int argc, char *argv[])