| diff --git a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp |
| index 2fcccfe..3e11f9f 100644 |
| --- a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp |
| +++ b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp |
| @@ -475,7 +475,7 @@ CV_EXPORTS_W void cornerSubPix( InputArray image, InputOutputArray corners, |
| CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners, |
| int maxCorners, double qualityLevel, double minDistance, |
| InputArray mask=noArray(), int blockSize=3, |
| - bool useHarrisDetector=false, double k=0.04 ); |
| + bool useHarrisDetector=false, double k=0.04, int ksize = 3); |
| |
| //! finds lines in the black-n-white image using the standard or pyramid Hough transform |
| CV_EXPORTS_W void HoughLines( InputArray image, OutputArray lines, |
| diff --git a/modules/imgproc/src/featureselect.cpp b/modules/imgproc/src/featureselect.cpp |
| index 827fd40..c018189 100644 |
| --- a/modules/imgproc/src/featureselect.cpp |
| +++ b/modules/imgproc/src/featureselect.cpp |
| @@ -55,7 +55,7 @@ template<typename T> struct greaterThanPtr |
| void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, |
| int maxCorners, double qualityLevel, double minDistance, |
| InputArray _mask, int blockSize, |
| - bool useHarrisDetector, double harrisK ) |
| + bool useHarrisDetector, double harrisK, int ksize) |
| { |
| Mat image = _image.getMat(), mask = _mask.getMat(); |
| |
| @@ -64,9 +64,9 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, |
| |
| Mat eig, tmp; |
| if( useHarrisDetector ) |
| - cornerHarris( image, eig, blockSize, 3, harrisK ); |
| + cornerHarris( image, eig, blockSize, ksize, harrisK ); |
| else |
| - cornerMinEigenVal( image, eig, blockSize, 3 ); |
| + cornerMinEigenVal( image, eig, blockSize, ksize ); |
| |
| double maxVal = 0; |
| minMaxLoc( eig, 0, &maxVal, 0, 0, mask ); |
| @@ -93,7 +93,7 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, |
| } |
| |
| sort( tmpCorners, greaterThanPtr<float>() ); |
| - vector<Point2f> corners; |
| + vector<Point3f> corners; |
| size_t i, j, total = tmpCorners.size(), ncorners = 0; |
| |
| if(minDistance >= 1) |
| @@ -163,7 +163,7 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, |
| // i,x, y, x_cell, y_cell, (int)minDistance, cell_size,x1,y1,x2,y2, grid_width,grid_height,c); |
| grid[y_cell*grid_width + x_cell].push_back(Point2f((float)x, (float)y)); |
| |
| - corners.push_back(Point2f((float)x, (float)y)); |
| + corners.push_back(Point3f((float)x, (float)y, *tmpCorners[i])); |
| ++ncorners; |
| |
| if( maxCorners > 0 && (int)ncorners == maxCorners ) |
| @@ -179,14 +179,25 @@ void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners, |
| int y = (int)(ofs / eig.step); |
| int x = (int)((ofs - y*eig.step)/sizeof(float)); |
| |
| - corners.push_back(Point2f((float)x, (float)y)); |
| + corners.push_back(Point3f((float)x, (float)y, *tmpCorners[i])); |
| ++ncorners; |
| if( maxCorners > 0 && (int)ncorners == maxCorners ) |
| break; |
| } |
| } |
| |
| - Mat(corners).convertTo(_corners, _corners.fixedType() ? _corners.type() : CV_32F); |
| + int rtype = _corners.fixedType() ? _corners.type() : CV_32F; |
| + if (2 == CV_MAT_CN(rtype)) |
| + { |
| + vector<Point2f> corners2d; |
| + for (vector<Point3f>::iterator it = corners.begin(); it != corners.end(); it++) |
| + { |
| + corners2d.push_back(Point2f((*it).x, (*it).y)); |
| + } |
| + Mat(corners2d).convertTo(_corners, rtype); |
| + } |
| + else |
| + Mat(corners).convertTo(_corners, rtype); |
| |
| /* |
| for( i = 0; i < total; i++ ) |