1

I am trying to use OpenCV for Android (OpenCV 2.4.3) I am writing a program to track keypoints. I am trying to use FeatureDetector to detect keypoints and then Video.calcOpticalFlowPyrLK to track them. The question that has me stumped is that the FeatureDetector function returns a MatOfKeyPoint while calcOpticalFlowPyrLK takes a MatOfPoint2f.

Note that MatOfKeyPoint is different from MatOfPoint (Conversion from MatOfPoint to MatOfPont2f is straightforward).

Here is my code so far:

//Feature detector for LKT flow estimation
FeatureDetector cvFeatureDetector;
//Vector of keypoints
MatOfKeyPoint keypoints;

...
...

//intitialize detector
cvFeatureDetector = FeatureDetector.create(FeatureDetector.GFTT);

keypoints = new MatOfKeyPoint();

...
...

//mPrevImgMat is a grayscale image - previous frame
//mCurrentImgMat is a grayscale image - current frame

//Run feature detector in previous image
cvFeatureDetector.detect(mPrevImgMat, keypoints);

MatOfPoint2f keypointsFound = new MatOfPoint2f();
MatOfByte keypointsStatus = new MatOfByte();
MatOfFloat err = new MatOfFloat();
Size winSize = new Size(25,25);
int maxLevel = 3;

//Optical flow to find keypoints in current image
Video.calcOpticalFlowPyrLK(mPrevImgMat, mCurrentImgMat, keypoints,
            keypointsFound, keypointsStatus, err, winSize, maxLevel);

//Obviously "keypoints" in the line above does not work. How does one covert
//keypoints to MatOfPoint2f?

Things I have tried unsuccessfully so far: (1) keypoints.convertTo() (2) Creating a vector from keypoints and then trying to populate a vector of Point Vector pointList. Then typecast to MatOfPoint2f when calling flow funciton (MatOfPoint2f) pointList (3) Trying to populate a MatOfPoint2f from scratch. Cant figure out how to do this (4) Using fromArray method in MatOfPoint2f - Not sure what this method does. Documentation is blank for this method. Am I missing something obvious?

mnut
  • 21
  • 6
  • did you see [this](http://stackoverflow.com/questions/11273588/how-to-convert-matofpoint-to-matofpoint2f-in-opencv-java-api)? – Leonidos Jan 15 '13 at 20:52
  • The two options suggested there dont seem to work: (1) Use new MatOfPoint2f( MatOfKeyPoint_array.toArray()) "The constructor MatOfPoint2f(Object[]) is undefined" (2) Use convertTo() on MatOfKeyPoint object: MatOfPoint2f pointListMat = new MatOfPoint2f(); cvFeatureDetector.detect(mPrevImgMat, keypoints); keypoints.convertTo(pointListMat, CvType.CV_32FC2); This compiles, but the statement Video.calcOpticalFlowPyrLK(mPrevImgMat, mCurrentImgMat, pointListMat, keypointsFound, keypointsStatus, err, winSize, maxLevel); causes crash with an OpenCV assertion error prevPtsMat size>=0 @Leonidos – mnut Jan 15 '13 at 21:19
  • I am asking about conversion from MatOfKeyPoint to MatOfPoint2f. Note that this is not the same as MatOfPoint to MatOfPoint2f. MatOfKeyPoint and MatOfPoint are two different classes. @Leonidos – mnut Jan 17 '13 at 19:21

1 Answers1

0

Answering my own question... I got the answer in another forum. The link to that discussion is below http://www.answers.opencv.org/question/6206/opencv4android-conversion-from-matofkeypoint-to/

mnut
  • 21
  • 6