IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
ImgComparison.h
Go to the documentation of this file.
1 // ImgComparison.h:
3 // ----------------
4 //
14 
15 #ifndef __IPSDKUNITTESTTOOLS_IMGCOMPARISON_H__
16 #define __IPSDKUNITTESTTOOLS_IMGCOMPARISON_H__
17 
18 #include <IPSDKImage/Image/BaseImage.h>
19 #include <IPSDKIPL/IPSDKIPLUtility/Processor/CompareImg/CompareImg.h>
21 #include <boost/format.hpp>
22 
23 namespace ipsdk {
24 namespace unittest {
25 
26 inline std::string convertPixelPositionToString(
27  const ipsdk::imaproc::attr::PixelPosition& pixPos,
28  const image::ImageConstPtr& pImg)
29 {
30  std::string str = (boost::format("x=%d, y=%d")
31  % pixPos.getValue<imaproc::attr::PixelPosition::X>()
32  % pixPos.getValue<imaproc::attr::PixelPosition::Y>()).str();
33  if(pImg->getVolumeGeometryType() == image::eVolumeGeometryType::eVGT_3d)
34  str += (boost::format(", z=%d") % pixPos.getValue<imaproc::attr::PixelPosition::Z>()).str();
35  if(pImg->getColorGeometryType() != image::eColorGeometryType::eCGT_Grey)
36  str += (boost::format(", c=%d") % pixPos.getValue<imaproc::attr::PixelPosition::C>()).str();
37  if (pImg->getTemporalGeometryType() == image::eTemporalGeometryType::eTGT_Sequence)
38  str += (boost::format(", t=%d") % pixPos.getValue<imaproc::attr::PixelPosition::T>()).str();
39  return str;
40 }
41 
42 inline std::string convertImgComparisonTolToString(const imaproc::attr::ImgComparisonTolerance& tol)
43 {
44  const imaproc::attr::eImgComparisonToleranceType& tolType =
45  tol.getValue<imaproc::attr::ImgComparisonTolerance::ToleranceType>();
46  switch (tolType.value()) {
47  case imaproc::attr::eImgComparisonToleranceType::eICTT_None:
48  return std::string("");
49  case imaproc::attr::eImgComparisonToleranceType::eICTT_Absolute:
50  return (boost::format(" with absolute tolerance=%e") % tol.getValue<imaproc::attr::ImgComparisonTolerance::AbsTol>()).str();
51  case imaproc::attr::eImgComparisonToleranceType::eICTT_Relative:
52  return (boost::format(" with relative tolerance=%e") % tol.getValue<imaproc::attr::ImgComparisonTolerance::RelTol>()).str();
53  case imaproc::attr::eImgComparisonToleranceType::eICTT_AbsoluteOrRelative:
54  return (boost::format(" with tolerance[absolute=%e, relative=%e]") % tol.getValue<imaproc::attr::ImgComparisonTolerance::AbsTol>() % tol.getValue<imaproc::attr::ImgComparisonTolerance::RelTol>()).str();
55  default:
56  return std::string("with unknown tolerance");
57  }
58 }
59 
60 inline BoolResult convertImgComparisonResToBoolResult(
61  const image::ImageConstPtr& pImg1,
62  const image::ImageConstPtr& pImg2,
63  const std::string& strPrefix,
64  const std::string& strImg1VarName,
65  const std::string& strImg2VarName)
66 {
67  const ipsdk::imaproc::attr::CompareResultPtr pRes =
68  ipsdk::imaproc::util::compareImg(pImg1, pImg2);
69 
70  if (pRes->getValue<ipsdk::imaproc::attr::CompareResult::BEqual>() == true)
71  return BoolResult(true, (boost::format("%s (for comparison of images %s and %s)")
72  % strPrefix
73  % strImg1VarName
74  % strImg2VarName).str());
75  else
76  return BoolResult(false, (boost::format("%s ([value1=%e not equals value2=%e at (%s)] for comparison of images %s and %s)")
77  % strPrefix
78  % pRes->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix1Value>()
79  % pRes->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix2Value>()
80  % convertPixelPositionToString(pRes->getNode<imaproc::attr::CompareResult::OutOfTolPixPosition>(), pImg1)
81  % strImg1VarName
82  % strImg2VarName).str());
83 }
84 
85 inline BoolResult convertImgComparison1Or2ResToBoolResult(
86  const image::ImageConstPtr& pImg,
87  const image::ImageConstPtr& pImgRef1,
88  const image::ImageConstPtr& pImgRef2,
89  const std::string& strPrefix,
90  const std::string& strImgVarName,
91  const std::string& strImgRef1VarName,
92  const std::string& strImgRef2VarName)
93 {
94  const ipsdk::imaproc::attr::CompareResultPtr pRes1 =
95  ipsdk::imaproc::util::compareImg(pImg, pImgRef1);
96 
97  const ipsdk::imaproc::attr::CompareResultPtr pRes2 =
98  ipsdk::imaproc::util::compareImg(pImg, pImgRef2);
99 
100  if (pRes1->getValue<ipsdk::imaproc::attr::CompareResult::BEqual>() == true)
101  return BoolResult(true, (boost::format("%s (for comparison of images %s and %s)")
102  % strPrefix
103  % strImgVarName
104  % strImgRef1VarName).str());
105  else if(pRes2->getValue<ipsdk::imaproc::attr::CompareResult::BEqual>() == true)
106  return BoolResult(true, (boost::format("%s (for comparison of images %s and %s)")
107  % strPrefix
108  % strImgVarName
109  % strImgRef2VarName).str());
110  else
111  return BoolResult(false, (boost::format("%s ([value1=%e not equals value2=%e at (%s)] for comparison of images %s and %s and [value1=%e not equals value2=%e at(%s)] for comparison of images %s and %s)")
112  % strPrefix
113  % pRes1->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix1Value>()
114  % pRes1->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix2Value>()
115  % convertPixelPositionToString(pRes1->getNode<imaproc::attr::CompareResult::OutOfTolPixPosition>(), pImg)
116  % strImgVarName
117  % strImgRef1VarName
118  % pRes2->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix1Value>()
119  % pRes2->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix2Value>()
120  % convertPixelPositionToString(pRes2->getNode<imaproc::attr::CompareResult::OutOfTolPixPosition>(), pImg)
121  % strImgVarName
122  % strImgRef2VarName
123  ).str());
124 }
125 
126 inline BoolResult convertImgComparisonResToBoolResult(
127  const image::ImageConstPtr& pImg1,
128  const image::ImageConstPtr& pImg2,
129  const imaproc::attr::ImgComparisonToleranceConstPtr& pTol,
130  const std::string& strPrefix,
131  const std::string& strImg1VarName,
132  const std::string& strImg2VarName)
133 {
134  ipsdk::imaproc::attr::CompareResultPtr pRes =
135  ipsdk::imaproc::util::compareImg(pImg1, pImg2, pTol);
136  std::string strMsgInsideMacro;
137  if (pRes->getValue<ipsdk::imaproc::attr::CompareResult::BEqual>() == true)
138  return BoolResult(true, (boost::format("%s (for comparison of images %s and %s%s)")
139  % strPrefix
140  % strImg1VarName
141  % strImg2VarName
142  % convertImgComparisonTolToString(*pTol)).str());
143  else
144  return BoolResult(false, (boost::format("%s ([value1=%e not equals value2=%e at (%s)] for comparison of images %s and %s%s)")
145  % strPrefix
146  % pRes->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix1Value>()
147  % pRes->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix2Value>()
148  % convertPixelPositionToString(pRes->getNode<ipsdk::imaproc::attr::CompareResult::OutOfTolPixPosition>(), pImg1)
149  % strImg1VarName
150  % strImg2VarName
151  % convertImgComparisonTolToString(*pTol)).str());
152 }
153 
154 inline BoolResult convertImgComparison1Or2ResToBoolResult(
155  const image::ImageConstPtr& pImg,
156  const image::ImageConstPtr& pImgRef1,
157  const image::ImageConstPtr& pImgRef2,
158  const imaproc::attr::ImgComparisonToleranceConstPtr& pTol,
159  const std::string& strPrefix,
160  const std::string& strImgVarName,
161  const std::string& strImgRef1VarName,
162  const std::string& strImgRef2VarName)
163 {
164  ipsdk::imaproc::attr::CompareResultPtr pRes1 =
165  ipsdk::imaproc::util::compareImg(pImg, pImgRef1, pTol);
166  ipsdk::imaproc::attr::CompareResultPtr pRes2 =
167  ipsdk::imaproc::util::compareImg(pImg, pImgRef2, pTol);
168  std::string strMsgInsideMacro;
169  if (pRes1->getValue<ipsdk::imaproc::attr::CompareResult::BEqual>() == true)
170  return BoolResult(true, (boost::format("%s (for comparison of images %s and %s%s)")
171  % strPrefix
172  % strImgVarName
173  % strImgRef1VarName
174  % convertImgComparisonTolToString(*pTol)).str());
175  else if (pRes2->getValue<ipsdk::imaproc::attr::CompareResult::BEqual>() == true)
176  return BoolResult(true, (boost::format("%s (for comparison of images %s and %s%s)")
177  % strPrefix
178  % strImgVarName
179  % strImgRef2VarName
180  % convertImgComparisonTolToString(*pTol)).str());
181  else
182  return BoolResult(false, (boost::format("%s ([value1=%e not equals value2=%e at (%s)] for comparison of images %s and %s and [value1=%e not equals value2=%e at(%s)] for comparison of images %s and %s%s )")
183  % strPrefix
184  % pRes1->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix1Value>()
185  % pRes1->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix2Value>()
186  % convertPixelPositionToString(pRes1->getNode<ipsdk::imaproc::attr::CompareResult::OutOfTolPixPosition>(), pImg)
187  % strImgVarName
188  % strImgRef1VarName
189  % pRes2->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix1Value>()
190  % pRes2->getValue<ipsdk::imaproc::attr::CompareResult::OutOfTolPix2Value>()
191  % convertPixelPositionToString(pRes2->getNode<ipsdk::imaproc::attr::CompareResult::OutOfTolPixPosition>(), pImg)
192  % strImgVarName
193  % strImgRef2VarName
194  % convertImgComparisonTolToString(*pTol)).str());
195 }
196 
197 
198 
199 } // end of namespace unittest
200 } // end of namespace ipsdk
201 
202 
203 
204 #define IPSDK_CHECK_IMG_EQUAL(pImg1, pImg2, strPrefix) \
205 do { \
206  const ipsdk::BoolResult __ipsdkInternalBRes = convertImgComparisonResToBoolResult(pImg1, pImg2, strPrefix, BOOST_PP_STRINGIZE(pImg1), BOOST_PP_STRINGIZE(pImg2)); \
207  IPSDK_UT_LOG_TEST_RES(strPrefix, __ipsdkInternalBRes)\
208  BOOST_CHECK_MESSAGE(__ipsdkInternalBRes, __ipsdkInternalBRes.getMsg()); \
209 } while(0)
210 
211 #define IPSDK_CHECK_IMG_EQUAL_TO_1_OR_2(pImg, pImgRef1, pImgRef2, strPrefix) \
212 do { \
213  const ipsdk::BoolResult __ipsdkInternalBRes = convertImgComparison1Or2ResToBoolResult(pImg, pImgRef1, pImgRef2, strPrefix, BOOST_PP_STRINGIZE(pImg), BOOST_PP_STRINGIZE(pImgRef1), BOOST_PP_STRINGIZE(pImgRef2)); \
214  IPSDK_UT_LOG_TEST_RES(strPrefix, __ipsdkInternalBRes)\
215  BOOST_CHECK_MESSAGE(__ipsdkInternalBRes, __ipsdkInternalBRes.getMsg()); \
216 } while(0)
217 
218 #define IPSDK_CHECK_IMG_CLOSE(pImg1, pImg2, pTol, strPrefix) \
219 do { \
220  const ipsdk::BoolResult __ipsdkInternalBRes = convertImgComparisonResToBoolResult(pImg1, pImg2, pTol, strPrefix, BOOST_PP_STRINGIZE(pImg1), BOOST_PP_STRINGIZE(pImg2)); \
221  IPSDK_UT_LOG_TEST_RES(strPrefix, __ipsdkInternalBRes)\
222  BOOST_CHECK_MESSAGE(__ipsdkInternalBRes, __ipsdkInternalBRes.getMsg()); \
223 } while(0)
224 
225 #define IPSDK_CHECK_IMG_CLOSE_TO_1_OR_2(pImg, pImgRef1, pImgRef2, pTol, strPrefix) \
226 do { \
227  const ipsdk::BoolResult __ipsdkInternalBRes = convertImgComparison1Or2ResToBoolResult(pImg, pImgRef1, pImgRef2, pTol, strPrefix, BOOST_PP_STRINGIZE(pImg), BOOST_PP_STRINGIZE(pImgRef1), BOOST_PP_STRINGIZE(pImgRef2)); \
228  IPSDK_UT_LOG_TEST_RES(strPrefix, __ipsdkInternalBRes)\
229  BOOST_CHECK_MESSAGE(__ipsdkInternalBRes, __ipsdkInternalBRes.getMsg()); \
230 } while(0)
231 
232 #endif // __IPSDKUNITTESTTOOLS_IMGCOMPARISON_H__
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
3d geometry
Definition: GeometryComponentTypes.h:36
Predefined macros for unit test management.
sequence of elements temporal geometry
Definition: GeometryComponentTypes.h:80
grey level geometry
Definition: GeometryComponentTypes.h:47
boost::shared_ptr< const BaseImage > ImageConstPtr
Definition: ImageTypes.h:140
ProcessingResult< bool > BoolResult
typedef for boolean results associated to a string description
Definition: ProcessingResultTypes.h:29