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

curbwframe

skinmask

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

Popular posts from this blog

jquery - Invalid Assignment Left-Hand Side -

java - Play! framework 2.0: How to display multiple image? -

gmail - Is there any documentation for read-only access to the Google Contacts API? -