fix the function name

pull/1077/head
yao 12 years ago
parent c23510785b
commit 88ed74a7ec
  1. 2
      modules/ocl/include/opencv2/ocl/ocl.hpp
  2. 36
      modules/ocl/src/kmeans.cpp
  3. 15
      modules/ocl/src/opencl/kmeans_kernel.cl

@ -838,7 +838,7 @@ namespace cv
//! Compute closest centers for each lines in source and lable it after center's index //! Compute closest centers for each lines in source and lable it after center's index
// supports CV_32FC1/CV_32FC2/CV_32FC4 data type // supports CV_32FC1/CV_32FC2/CV_32FC4 data type
void DistanceComputer(oclMat &dists, oclMat &labels, const oclMat &src, const oclMat &centers); CV_EXPORTS void distanceToCenters(oclMat &dists, oclMat &labels, const oclMat &src, const oclMat &centers);
//!Does k-means procedure on GPU //!Does k-means procedure on GPU
// supports CV_32FC1/CV_32FC2/CV_32FC4 data type // supports CV_32FC1/CV_32FC2/CV_32FC4 data type

@ -51,11 +51,11 @@ using namespace ocl;
namespace cv namespace cv
{ {
namespace ocl namespace ocl
{ {
////////////////////////////////////OpenCL kernel strings////////////////////////// ////////////////////////////////////OpenCL kernel strings//////////////////////////
extern const char *kmeans_kernel; extern const char *kmeans_kernel;
} }
} }
static void generateRandomCenter(const vector<Vec2f>& box, float* center, RNG& rng) static void generateRandomCenter(const vector<Vec2f>& box, float* center, RNG& rng)
@ -142,7 +142,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers,
int ci = i; int ci = i;
parallel_for_(Range(0, N), parallel_for_(Range(0, N),
KMeansPPDistanceComputer(tdist2, data, dist, dims, step, step*ci)); KMeansPPDistanceComputer(tdist2, data, dist, dims, step, step*ci));
for( i = 0; i < N; i++ ) for( i = 0; i < N; i++ )
{ {
s += tdist2[i]; s += tdist2[i];
@ -169,7 +169,7 @@ static void generateCentersPP(const Mat& _data, Mat& _out_centers,
} }
} }
void cv::ocl::DistanceComputer(oclMat &dists, oclMat &labels, const oclMat &src, const oclMat &centers) void cv::ocl::distanceToCenters(oclMat &dists, oclMat &labels, const oclMat &src, const oclMat &centers)
{ {
//if(src.clCxt -> impl -> double_support == 0 && src.type() == CV_64F) //if(src.clCxt -> impl -> double_support == 0 && src.type() == CV_64F)
//{ //{
@ -179,7 +179,7 @@ void cv::ocl::DistanceComputer(oclMat &dists, oclMat &labels, const oclMat &src,
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
int labels_step = (int)(labels.step/labels.elemSize()); int labels_step = (int)(labels.step/labels.elemSize());
string kernelname = "kmeansComputeDistance"; string kernelname = "distanceToCenters";
int threadNum = src.rows > 256 ? 256 : src.rows; int threadNum = src.rows > 256 ? 256 : src.rows;
size_t localThreads[3] = {1, threadNum, 1}; size_t localThreads[3] = {1, threadNum, 1};
size_t globalThreads[3] = {1, src.rows, 1}; size_t globalThreads[3] = {1, src.rows, 1};
@ -198,7 +198,7 @@ void cv::ocl::DistanceComputer(oclMat &dists, oclMat &labels, const oclMat &src,
} }
///////////////////////////////////k - means ///////////////////////////////////////////////////////// ///////////////////////////////////k - means /////////////////////////////////////////////////////////
double cv::ocl::kmeans(const oclMat &_src, int K, oclMat &_bestLabels, double cv::ocl::kmeans(const oclMat &_src, int K, oclMat &_bestLabels,
TermCriteria criteria, int attempts, int flags, oclMat &_centers) TermCriteria criteria, int attempts, int flags, oclMat &_centers)
{ {
const int SPP_TRIALS = 3; const int SPP_TRIALS = 3;
bool isrow = _src.rows == 1 && _src.oclchannels() > 1; bool isrow = _src.rows == 1 && _src.oclchannels() > 1;
@ -214,16 +214,16 @@ double cv::ocl::kmeans(const oclMat &_src, int K, oclMat &_bestLabels,
if( flags & CV_KMEANS_USE_INITIAL_LABELS ) if( flags & CV_KMEANS_USE_INITIAL_LABELS )
{ {
CV_Assert( (_bestLabels.cols == 1 || _bestLabels.rows == 1) && CV_Assert( (_bestLabels.cols == 1 || _bestLabels.rows == 1) &&
_bestLabels.cols * _bestLabels.rows == N && _bestLabels.cols * _bestLabels.rows == N &&
_bestLabels.type() == CV_32S ); _bestLabels.type() == CV_32S );
_bestLabels.download(_labels); _bestLabels.download(_labels);
} }
else else
{ {
if( !((_bestLabels.cols == 1 || _bestLabels.rows == 1) && if( !((_bestLabels.cols == 1 || _bestLabels.rows == 1) &&
_bestLabels.cols * _bestLabels.rows == N && _bestLabels.cols * _bestLabels.rows == N &&
_bestLabels.type() == CV_32S && _bestLabels.type() == CV_32S &&
_bestLabels.isContinuous())) _bestLabels.isContinuous()))
_bestLabels.create(N, 1, CV_32S); _bestLabels.create(N, 1, CV_32S);
_labels.create(_bestLabels.size(), _bestLabels.type()); _labels.create(_bestLabels.size(), _bestLabels.type());
} }
@ -307,7 +307,7 @@ double cv::ocl::kmeans(const oclMat &_src, int K, oclMat &_bestLabels,
k = labels[i]; k = labels[i];
float* center = centers.ptr<float>(k); float* center = centers.ptr<float>(k);
j=0; j=0;
#if CV_ENABLE_UNROLLED #if CV_ENABLE_UNROLLED
for(; j <= dims - 4; j += 4 ) for(; j <= dims - 4; j += 4 )
{ {
float t0 = center[j] + sample[j]; float t0 = center[j] + sample[j];
@ -322,7 +322,7 @@ double cv::ocl::kmeans(const oclMat &_src, int K, oclMat &_bestLabels,
center[j+2] = t0; center[j+2] = t0;
center[j+3] = t1; center[j+3] = t1;
} }
#endif #endif
for( ; j < dims; j++ ) for( ; j < dims; j++ )
center[j] += sample[j]; center[j] += sample[j];
counters[k]++; counters[k]++;
@ -410,10 +410,10 @@ double cv::ocl::kmeans(const oclMat &_src, int K, oclMat &_bestLabels,
// assign labels // assign labels
oclMat _dists(1, N, CV_64F); oclMat _dists(1, N, CV_64F);
_bestLabels.upload(_labels); _bestLabels.upload(_labels);
_centers.upload(centers); _centers.upload(centers);
DistanceComputer(_dists, _bestLabels, _src, _centers); distanceToCenters(_dists, _bestLabels, _src, _centers);
Mat dists; Mat dists;
_dists.download(dists); _dists.download(dists);

@ -43,7 +43,7 @@
// //
//M*/ //M*/
__kernel void kmeansComputeDistance( __kernel void distanceToCenters(
int label_step, int K, int label_step, int K,
__global float *src, __global float *src,
__global int *labels, int dims, int rows, __global int *labels, int dims, int rows,
@ -51,20 +51,20 @@ __kernel void kmeansComputeDistance(
__global float *dists) __global float *dists)
{ {
int gid = get_global_id(1); int gid = get_global_id(1);
float dist, euDist, min; float dist, euDist, min;
int minCentroid; int minCentroid;
if(gid >= rows) if(gid >= rows)
return; return;
for(int i = 0 ;i < K; i++) for(int i = 0 ; i < K; i++)
{ {
euDist = 0; euDist = 0;
for(int j = 0; j < dims; j++) for(int j = 0; j < dims; j++)
{ {
dist = (src[j + gid * dims] dist = (src[j + gid * dims]
- centers[j + i * dims]); - centers[j + i * dims]);
euDist += dist * dist; euDist += dist * dist;
} }
@ -72,7 +72,8 @@ __kernel void kmeansComputeDistance(
{ {
min = euDist; min = euDist;
minCentroid = 0; minCentroid = 0;
} else if(euDist < min) }
else if(euDist < min)
{ {
min = euDist; min = euDist;
minCentroid = i; minCentroid = i;

Loading…
Cancel
Save