Commit 3ab117df authored by Aaron Denney's avatar Aaron Denney

Change struct with single static function to function.

parent 021b0cb4
...@@ -82,39 +82,30 @@ namespace cv { namespace cuda { namespace device ...@@ -82,39 +82,30 @@ namespace cv { namespace cuda { namespace device
/////////////////////// init data cost //////////////////////// /////////////////////// init data cost ////////////////////////
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
template <int channels> struct DataCostPerPixel; template <int channels> float __device__ pixeldiff(const uchar* left, const uchar* right);
template <> struct DataCostPerPixel<1> template<> float __device__ __forceinline__ pixeldiff<1>(const uchar* left, const uchar* right)
{ {
static __device__ __forceinline__ float compute(const uchar* left, const uchar* right) return cdata_weight * fmin( ::abs((int)*left - *right), cmax_data_term);
{ }
return cdata_weight * fmin( ::abs((int)*left - *right), cmax_data_term); template <> float __device__ __forceinline__ pixeldiff<3>(const uchar* left, const uchar* right)
}
};
template <> struct DataCostPerPixel<3>
{ {
static __device__ __forceinline__ float compute(const uchar* left, const uchar* right) float tb = 0.114f * ::abs((int)left[0] - right[0]);
{ float tg = 0.587f * ::abs((int)left[1] - right[1]);
float tb = 0.114f * ::abs((int)left[0] - right[0]); float tr = 0.299f * ::abs((int)left[2] - right[2]);
float tg = 0.587f * ::abs((int)left[1] - right[1]);
float tr = 0.299f * ::abs((int)left[2] - right[2]);
return cdata_weight * fmin(tr + tg + tb, cmax_data_term); return cdata_weight * fmin(tr + tg + tb, cmax_data_term);
} }
}; template <> float __device__ __forceinline__ pixeldiff<4>(const uchar* left, const uchar* right)
template <> struct DataCostPerPixel<4>
{ {
static __device__ __forceinline__ float compute(const uchar* left, const uchar* right) uchar4 l = *((const uchar4*)left);
{ uchar4 r = *((const uchar4*)right);
uchar4 l = *((const uchar4*)left);
uchar4 r = *((const uchar4*)right);
float tb = 0.114f * ::abs((int)l.x - r.x); float tb = 0.114f * ::abs((int)l.x - r.x);
float tg = 0.587f * ::abs((int)l.y - r.y); float tg = 0.587f * ::abs((int)l.y - r.y);
float tr = 0.299f * ::abs((int)l.z - r.z); float tr = 0.299f * ::abs((int)l.z - r.z);
return cdata_weight * fmin(tr + tg + tb, cmax_data_term); return cdata_weight * fmin(tr + tg + tb, cmax_data_term);
} }
};
template <typename T> template <typename T>
__global__ void get_first_k_initial_global(uchar *ctemp, T* data_cost_selected_, T *selected_disp_pyr, int h, int w, int nr_plane, int ndisp) __global__ void get_first_k_initial_global(uchar *ctemp, T* data_cost_selected_, T *selected_disp_pyr, int h, int w, int nr_plane, int ndisp)
...@@ -237,7 +228,7 @@ namespace cv { namespace cuda { namespace device ...@@ -237,7 +228,7 @@ namespace cv { namespace cuda { namespace device
const uchar* lle = cleft + yi * cimg_step + xi * channels; const uchar* lle = cleft + yi * cimg_step + xi * channels;
const uchar* lri = cright + yi * cimg_step + xr * channels; const uchar* lri = cright + yi * cimg_step + xr * channels;
val += DataCostPerPixel<channels>::compute(lle, lri); val += pixeldiff<channels>(lle, lri);
} }
} }
} }
...@@ -274,7 +265,7 @@ namespace cv { namespace cuda { namespace device ...@@ -274,7 +265,7 @@ namespace cv { namespace cuda { namespace device
for(int y = 0; y < len; ++y) for(int y = 0; y < len; ++y)
{ {
val += DataCostPerPixel<channels>::compute(lle, lri); val += pixeldiff<channels>(lle, lri);
lle += cimg_step; lle += cimg_step;
lri += cimg_step; lri += cimg_step;
...@@ -416,7 +407,7 @@ namespace cv { namespace cuda { namespace device ...@@ -416,7 +407,7 @@ namespace cv { namespace cuda { namespace device
const uchar* left_x = cleft + yi * cimg_step + xi * channels; const uchar* left_x = cleft + yi * cimg_step + xi * channels;
const uchar* right_x = cright + yi * cimg_step + xr * channels; const uchar* right_x = cright + yi * cimg_step + xr * channels;
val += DataCostPerPixel<channels>::compute(left_x, right_x); val += pixeldiff<channels>(left_x, right_x);
} }
} }
} }
...@@ -458,7 +449,7 @@ namespace cv { namespace cuda { namespace device ...@@ -458,7 +449,7 @@ namespace cv { namespace cuda { namespace device
for(int y = 0; y < len; ++y) for(int y = 0; y < len; ++y)
{ {
val += DataCostPerPixel<channels>::compute(lle, lri); val += pixeldiff<channels>(lle, lri);
lle += cimg_step; lle += cimg_step;
lri += cimg_step; lri += cimg_step;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment