1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-30 15:53:03 +04:00

Merge pull request #19392 from amirtu:OCV-165_finalize_goodFeaturesToTrack_returns_also_corner_value_PR

* goodFeaturesToTrack returns also corner value

(cherry picked from commit 4a8f06755c)

* Added response to GFTT Detector keypoints

(cherry picked from commit b88fb40c6e)

* Moved corner values to another optional variable to preserve backward compatibility

(cherry picked from commit 6137383d32)

* Removed corners valus from perf tests and better unit tests for corners values

(cherry picked from commit f3d0ef21a7)

* Fixed detector gftt call

(cherry picked from commit be2975553b)

* Restored test_cornerEigenValsVecs

(cherry picked from commit ea3e11811f)

* scaling fixed;
mineigen calculation rolled back;
gftt function overload added (with quality parameter);
perf tests were added for the new api function;
external bindings were added for the function (with different alias);
fixed issues with composition of the output array of the new function (e.g. as requested in comments) ;
added sanity checks in the perf tests;
removed C API changes.

* minor change to GFTTDetector::detect

* substitute ts->printf with EXPECT_LE

* avoid re-allocations

Co-authored-by: Anas <anas.el.amraoui@live.com>
Co-authored-by: amir.tulegenov <amir.tulegenov@xperience.ai>
This commit is contained in:
Amir Tulegenov
2021-02-16 01:55:57 +06:00
committed by GitHub
parent ad66b070a7
commit 47426a8ae5
7 changed files with 183 additions and 28 deletions
+40 -12
View File
@@ -74,8 +74,8 @@ struct Corner
static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray _mask, int blockSize, int gradientSize,
bool useHarrisDetector, double harrisK )
InputArray _mask, OutputArray _cornersQuality, int blockSize, int gradientSize,
bool useHarrisDetector, double harrisK)
{
UMat eig, maxEigenValue;
if( useHarrisDetector )
@@ -176,7 +176,9 @@ static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
std::sort(corner_ptr, corner_ptr + total);
std::vector<Point2f> corners;
std::vector<float> cornersQuality;
corners.reserve(total);
cornersQuality.reserve(total);
if (minDistance >= 1)
{
@@ -237,6 +239,7 @@ static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
grid[y_cell*grid_width + x_cell].push_back(Point2f((float)c.x, (float)c.y));
corners.push_back(Point2f((float)c.x, (float)c.y));
cornersQuality.push_back(c.val);
++ncorners;
if( maxCorners > 0 && (int)ncorners == maxCorners )
@@ -251,13 +254,19 @@ static bool ocl_goodFeaturesToTrack( InputArray _image, OutputArray _corners,
const Corner & c = corner_ptr[i];
corners.push_back(Point2f((float)c.x, (float)c.y));
cornersQuality.push_back(c.val);
++ncorners;
if( maxCorners > 0 && (int)ncorners == maxCorners )
break;
}
}
Mat(corners).convertTo(_corners, _corners.fixedType() ? _corners.type() : CV_32F);
if (_cornersQuality.needed()) {
Mat(cornersQuality).convertTo(_cornersQuality, _cornersQuality.fixedType() ? _cornersQuality.type() : CV_32F);
}
return true;
}
@@ -354,9 +363,25 @@ static bool openvx_harris(Mat image, OutputArray _corners,
}
void cv::goodFeaturesToTrack( InputArray image, OutputArray corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray mask, int blockSize, bool useHarrisDetector, double k )
{
return goodFeaturesToTrack(image, corners, maxCorners, qualityLevel, minDistance,
mask, noArray(), blockSize, 3, useHarrisDetector, k);
}
void cv::goodFeaturesToTrack( InputArray image, OutputArray corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray mask, int blockSize, int gradientSize, bool useHarrisDetector, double k )
{
return goodFeaturesToTrack( image, corners, maxCorners, qualityLevel, minDistance,
mask, noArray(), blockSize, gradientSize, useHarrisDetector, k );
}
void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray _mask, int blockSize, int gradientSize,
InputArray _mask, OutputArray _cornersQuality, int blockSize, int gradientSize,
bool useHarrisDetector, double harrisK )
{
CV_INSTRUMENT_REGION();
@@ -366,12 +391,13 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
CV_OCL_RUN(_image.dims() <= 2 && _image.isUMat(),
ocl_goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance,
_mask, blockSize, gradientSize, useHarrisDetector, harrisK))
_mask, _cornersQuality, blockSize, gradientSize, useHarrisDetector, harrisK))
Mat image = _image.getMat(), eig, tmp;
if (image.empty())
{
_corners.release();
_cornersQuality.release();
return;
}
@@ -410,11 +436,13 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
}
std::vector<Point2f> corners;
std::vector<float> cornersQuality;
size_t i, j, total = tmpCorners.size(), ncorners = 0;
if (total == 0)
{
_corners.release();
_cornersQuality.release();
return;
}
@@ -485,6 +513,8 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
{
grid[y_cell*grid_width + x_cell].push_back(Point2f((float)x, (float)y));
cornersQuality.push_back(*tmpCorners[i]);
corners.push_back(Point2f((float)x, (float)y));
++ncorners;
@@ -497,18 +527,24 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
{
for( i = 0; i < total; i++ )
{
cornersQuality.push_back(*tmpCorners[i]);
int ofs = (int)((const uchar*)tmpCorners[i] - eig.ptr());
int y = (int)(ofs / eig.step);
int x = (int)((ofs - y*eig.step)/sizeof(float));
corners.push_back(Point2f((float)x, (float)y));
++ncorners;
if( maxCorners > 0 && (int)ncorners == maxCorners )
break;
}
}
Mat(corners).convertTo(_corners, _corners.fixedType() ? _corners.type() : CV_32F);
if (_cornersQuality.needed()) {
Mat(cornersQuality).convertTo(_cornersQuality, _cornersQuality.fixedType() ? _cornersQuality.type() : CV_32F);
}
}
CV_IMPL void
@@ -534,12 +570,4 @@ cvGoodFeaturesToTrack( const void* _image, void*, void*,
*_corner_count = (int)ncorners;
}
void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray _mask, int blockSize,
bool useHarrisDetector, double harrisK )
{
cv::goodFeaturesToTrack(_image, _corners, maxCorners, qualityLevel, minDistance,
_mask, blockSize, 3, useHarrisDetector, harrisK );
}
/* End of file. */