1
0
mirror of https://github.com/opencv/opencv_contrib.git synced 2025-10-19 19:44:14 +08:00

Merge pull request #3999 from incubus-ank:fix/cuda_fast_detectAsync_memory_leak

Add missing cudaFree #3999

I found missing memory cudaFree in cv::cuda::FAST_Impl::detectAsync()

I created an issue, but did not receive a response.
https://github.com/opencv/opencv_contrib/issues/3994

### Pull Request Readiness Checklist

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable 
Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
This commit is contained in:
Alexander Kraynikov
2025-09-12 19:02:37 +03:00
committed by GitHub
parent 095981ca99
commit b01e6a7581

View File

@@ -66,6 +66,7 @@ namespace
{ {
public: public:
FAST_Impl(int threshold, bool nonmaxSuppression, int max_npoints); FAST_Impl(int threshold, bool nonmaxSuppression, int max_npoints);
~FAST_Impl();
virtual void detect(InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask); virtual void detect(InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask);
virtual void detectAsync(InputArray _image, OutputArray _keypoints, InputArray _mask, Stream& stream); virtual void detectAsync(InputArray _image, OutputArray _keypoints, InputArray _mask, Stream& stream);
@@ -95,6 +96,12 @@ namespace
FAST_Impl::FAST_Impl(int threshold, bool nonmaxSuppression, int max_npoints) : FAST_Impl::FAST_Impl(int threshold, bool nonmaxSuppression, int max_npoints) :
threshold_(threshold), nonmaxSuppression_(nonmaxSuppression), max_npoints_(max_npoints) threshold_(threshold), nonmaxSuppression_(nonmaxSuppression), max_npoints_(max_npoints)
{ {
cudaSafeCall( cudaMalloc(&d_counter, sizeof(unsigned int)) );
}
FAST_Impl::~FAST_Impl()
{
cudaSafeCall( cudaFree(d_counter) );
} }
void FAST_Impl::detect(InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask) void FAST_Impl::detect(InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask)
@@ -116,8 +123,6 @@ namespace
{ {
using namespace cv::cuda::device::fast; using namespace cv::cuda::device::fast;
cudaSafeCall( cudaMalloc(&d_counter, sizeof(unsigned int)) );
const GpuMat img = _image.getGpuMat(); const GpuMat img = _image.getGpuMat();
const GpuMat mask = _mask.getGpuMat(); const GpuMat mask = _mask.getGpuMat();
@@ -165,8 +170,6 @@ namespace
kpLoc.colRange(0, count).copyTo(locRow, stream); kpLoc.colRange(0, count).copyTo(locRow, stream);
keypoints.row(1).setTo(Scalar::all(0), stream); keypoints.row(1).setTo(Scalar::all(0), stream);
} }
cudaSafeCall( cudaFree(d_counter) );
} }
void FAST_Impl::convert(InputArray _gpu_keypoints, std::vector<KeyPoint>& keypoints) void FAST_Impl::convert(InputArray _gpu_keypoints, std::vector<KeyPoint>& keypoints)