c++ - cv::goodFeaturesToTrack doesn't return any features -
i'm trying use cv::calcopticalflowpyrlk internal assertion in function fails. assertion npoints = prevptsmat.checkvector(2, cv_32f, true)) >= 0. i'm using opencv 2.3.1. source code function available here.
it's hard wrap head around code, because of limited experience computer graphics , lack of comments. why assertion being triggered , problem?
edit: call function follows:
cv::calcopticalflowpyrlk(curbwframe, prvframe, features, newfeatures, trackingstatus, errors); i found out features vector, obtained calling cv::goodfeaturestotrack(curbwframe, features, 5, 0.2, 0.5, skinmask); non-empty mask appears sufficiently big , valid image, doesn't contain features. how can happen?
curbwframe

skinmask

i'm able reproduce problem using following code snippet:
#include <vector> #include <cassert> #include <opencv2\opencv.hpp> using std::vector; using namespace cv; int main() { vector<point2f> features; cv::mat curbwframe = imread("curbwframe.png"); cv::cvtcolor(curbwframe, curbwframe, cv_rgb2gray); imwrite("test.png", curbwframe); cv::mat skinmask = imread("skinmask.png"); cv::cvtcolor(skinmask, skinmask, cv_rgb2gray); imwrite("test.png", skinmask); cv::goodfeaturestotrack(curbwframe, features, 5, 0.2, 0.5, skinmask); assert(features.size() > 0); return 0; }
the main problem parameters.in opencv 2.3.2 documentation (no compatibility change between 2.3.1) description of method parameters:
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 ) parameters:
- image – input 8-bit or floating-point 32-bit, single-channel image.
- corners – output vector of detected corners.
- maxcorners – maximum number of corners return. if there more corners found, strongest of them returned.
- qualitylevel – parameter characterizing minimal accepted quality of image corners. parameter value multiplied best corner quality measure, minimal eigenvalue (see cornermineigenval() ) or harris function response (see cornerharris() ). corners quality measure less product rejected. example, if best corner has quality measure = 1500, , qualitylevel=0.01 , corners quality measure less 15 rejected.
- mindistance – minimum possible euclidean distance between returned corners.
- mask – optional region of interest. if image not empty (it needs have type cv_8uc1 , same size image ), specifies region in corners detected.
- blocksize – size of average block computing derivative covariation matrix on each pixel neighborhood. see cornereigenvalsandvecs() .
- useharrisdetector – parameter indicating whether use harris detector (see cornerharris()) or cornermineigenval().
- k – free parameter of harris detector.
i recommend play little qualitylevel , mindistance suffice needs.
Comments
Post a Comment