
Hi Mark, On Mon, Nov 7, 2011 at 11:12 AM, Sapp, Mark <Mark.Sapp@aeroflex.com> wrote:
Hi all,
I have encountered a compilation error in Visual Studio 2010 that I can't find any information online about. The error is:
error C2338: (is_same<typename Layout::color_space_t, gray_t>::value) template <typename Out> struct op_absoluteDifference { template <typename T> Out operator()(const T& in1, const T& in2) const { return Out(abs(in2-in1)); } };
Constructing Out is your problem -- you're initializing a multi-channel pixel type (rgb8_pixel_t) with a single value. Either convert to a grayscale image before using calling absoluteDifference, or if you actually want the absolute difference across all channels, call static transform: #include <boost/gil/image.hpp> #include <boost/gil/typedefs.hpp> using namespace boost::gil; struct op_absoluteDifferenceChannel { template <typename T> T operator()(const T& in1, const T& in2) const { return T(abs(in2-in1)); } }; struct op_absoluteDifferencePixel { template <typename T> T operator()(const T& in1, const T& in2) const { T retVal; static_transform(in1, in2, retVal, op_absoluteDifferenceChannel()); return retVal; } }; template <typename SrcView1, typename SrcView2, typename DstView> void absoluteDifference(const SrcView1& src1, const SrcView2& src2, const DstView& dst) { typedef typename channel_type<DstView>::type dst_channel_t; transform_pixels(src1, src2, dst, op_absoluteDifferencePixel()); } int main() { rgb8_image_t img1(100,100); fill_pixels(view(img1), rgb8_pixel_t(0,0,0)); rgb8_image_t img2(100,100); fill_pixels(view(img2), rgb8_pixel_t(10,20,30)); rgb8_image_t img3(100,100); fill_pixels(view(img3), rgb8_pixel_t(0,0,0)); absoluteDifference(const_view(img1), const_view(img2), view(img3)); //causes compilation error C2338: (is_same<typename Layout::color_space_t, gray_t>::value) gray16_image_t img4(100,100); fill_pixels(view(img4), gray16_pixel_t(0)); gray16_image_t img5(100,100); fill_pixels(view(img5), gray16_pixel_t(10)); gray16_image_t img6(100,100); fill_pixels(view(img6), gray16_pixel_t(0)); absoluteDifference(const_view(img4), const_view(img5), view(img6)); return 0; } HTH, Nate