From f4ef0c15985a26a559b3eaf2286a2da13cf999fd Mon Sep 17 00:00:00 2001 From: yao Date: Fri, 22 Feb 2013 10:13:20 +0800 Subject: [PATCH] fix meanShift mismatch on none-double GPUs --- modules/ocl/src/kernels/meanShift.cl | 19 +++++++------------ modules/ocl/test/test_imgproc.cpp | 15 +++++---------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/modules/ocl/src/kernels/meanShift.cl b/modules/ocl/src/kernels/meanShift.cl index bb68331c7b..4b5a08b352 100644 --- a/modules/ocl/src/kernels/meanShift.cl +++ b/modules/ocl/src/kernels/meanShift.cl @@ -12,11 +12,13 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors // Shengen Yan,yanshengen@gmail.com // Xu Pang, pangxu010@163.com +// Wenju He, wenju@multicorewareinc.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -43,12 +45,6 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ -#if defined (DOUBLE_SUPPORT) -#pragma OPENCL EXTENSION cl_khr_fp64:enable -typedef double F; -#else -typedef float F; -#endif short2 do_mean_shift(int x0, int y0, __global uchar4* out,int out_step, __global uchar4* in, int in_step, int dst_off, int src_off, @@ -184,12 +180,11 @@ short2 do_mean_shift(int x0, int y0, __global uchar4* out,int out_step, if( count == 0 ) break; - F icount = 1.0/count; - int x1 = convert_int_rtz(sx*icount); - int y1 = convert_int_rtz(sy*icount); - s.x = convert_int_rtz(s.x*icount); - s.y = convert_int_rtz(s.y*icount); - s.z = convert_int_rtz(s.z*icount); + int x1 = sx/count; + int y1 = sy/count; + s.x = s.x/count; + s.y = s.y/count; + s.z = s.z/count; int4 tmp = s - convert_int4(c); int norm2 = tmp.x * tmp.x + tmp.y * tmp.y + diff --git a/modules/ocl/test/test_imgproc.cpp b/modules/ocl/test/test_imgproc.cpp index 97174ecbd3..5bf08c80e1 100644 --- a/modules/ocl/test/test_imgproc.cpp +++ b/modules/ocl/test/test_imgproc.cpp @@ -183,12 +183,11 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size if( count == 0 ) break; - double icount = 1.0 / count; - int x1 = cvFloor(sx * icount); - int y1 = cvFloor(sy * icount); - s0 = cvFloor(s0 * icount); - s1 = cvFloor(s1 * icount); - s2 = cvFloor(s2 * icount); + int x1 = sx / count; + int y1 = sy / count; + s0 = s0 / count; + s1 = s1 / count; + s2 = s2 / count; bool stopFlag = (x0 == x1 && y0 == y1) || (abs(x1 - x0) + abs(y1 - y0) + tab[s0 - c0 + 255] + tab[s1 - c1 + 255] + tab[s2 - c2 + 255] <= eps); @@ -1370,9 +1369,7 @@ TEST_P(meanShiftFiltering, Mat) gdst.download(cpu_gdst); char sss[1024]; - char warning[300] = "Warning: If the selected device doesn't support double, a deviation will exist.\nIf the accuracy is acceptable, please ignore it.\n"; sprintf(sss, "roicols=%d,roirows=%d,srcx=%d,srcy=%d,dstx=%d,dsty=%d\n", roicols, roirows, srcx, srcy, dstx, dsty); - strcat(sss, warning); EXPECT_MAT_NEAR(dst, cpu_gdst, 0.0, sss); } @@ -1398,9 +1395,7 @@ TEST_P(meanShiftProc, Mat) gdstCoor.download(cpu_gdstCoor); char sss[1024]; - char warning[300] = "Warning: If the selected device doesn't support double, a deviation will exist.\nIf the accuracy is acceptable, please ignore it.\n"; sprintf(sss, "roicols=%d,roirows=%d,srcx=%d,srcy=%d,dstx=%d,dsty=%d\n", roicols, roirows, srcx, srcy, dstx, dsty); - strcat(sss, warning); EXPECT_MAT_NEAR(dst, cpu_gdst, 0.0, sss); EXPECT_MAT_NEAR(dstCoor, cpu_gdstCoor, 0.0, sss); }