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 commit4a8f06755c) * Added response to GFTT Detector keypoints (cherry picked from commitb88fb40c6e) * Moved corner values to another optional variable to preserve backward compatibility (cherry picked from commit6137383d32) * Removed corners valus from perf tests and better unit tests for corners values (cherry picked from commitf3d0ef21a7) * Fixed detector gftt call (cherry picked from commitbe2975553b) * Restored test_cornerEigenValsVecs (cherry picked from commitea3e11811f) * 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:
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user