diff --git a/modules/cudaimgproc/src/hough_circles.cpp b/modules/cudaimgproc/src/hough_circles.cpp index 0cf94a63d1..2a3abe4868 100644 --- a/modules/cudaimgproc/src/hough_circles.cpp +++ b/modules/cudaimgproc/src/hough_circles.cpp @@ -133,6 +133,7 @@ namespace GpuMat dx_, dy_; GpuMat edges_; GpuMat accum_; + Mat tt; //CPU copy of accum_ GpuMat list_; GpuMat result_; Ptr filterDx_; @@ -140,6 +141,8 @@ namespace Ptr canny_; }; + bool centersCompare(Vec3f a, Vec3f b) {return (a[2] > b[2]);} + HoughCirclesDetectorImpl::HoughCirclesDetectorImpl(float dp, float minDist, int cannyThreshold, int votesThreshold, int minRadius, int maxRadius, int maxCircles) : dp_(dp), minDist_(minDist), cannyThreshold_(cannyThreshold), votesThreshold_(votesThreshold), @@ -193,6 +196,8 @@ namespace circlesAccumCenters_gpu(srcPoints, pointsCount, dx_, dy_, accum_, minRadius_, maxRadius_, idp); + accum_.download(tt); + int centersCount = buildCentersList_gpu(accum_, centers, votesThreshold_); if (centersCount == 0) { @@ -219,9 +224,21 @@ namespace const float minDist2 = minDist_ * minDist_; + vector sortBuf; + for(int i=0; i(temp[1]+1, temp[0]+1); + sortBuf.push_back(temp); + } + std::sort(sortBuf.begin(), sortBuf.end(), centersCompare); + for (int i = 0; i < centersCount; ++i) { - ushort2 p = oldBuf[i]; + ushort2 p; + p.x = sortBuf[i][0]; + p.y = sortBuf[i][1]; bool good = true; diff --git a/modules/cudaimgproc/src/precomp.hpp b/modules/cudaimgproc/src/precomp.hpp index 964c28c158..3bbb2a8f08 100644 --- a/modules/cudaimgproc/src/precomp.hpp +++ b/modules/cudaimgproc/src/precomp.hpp @@ -60,5 +60,6 @@ #endif #include +#include #endif /* __OPENCV_PRECOMP_H__ */