Android Optical Flow with opencv
Im trying to implement optical flow in android using openCV http://code.google.com/p/android-opencv/. Basicly i want to build something like this http://www.youtube.com/watch?v=P_Sjn67jIJY . Anyway because im new to android development can anyone guide somewhere in order to build something like the one on the video? Ive already insta开发者_JS百科lled opencv port to android and build the cvcamera example successfully using eclipse. Thanks, Thanos
See this Stanford OpenCV optical flow link. Things should work essentially the same way except the calls may be slightly different due to 1.x vs. 2.x's C vs C++ API issues.
Just edit the CVCamera example and it should be quick. I made a real-time face detection app within about an hour of getting CVCamera to work.
Visit http://opencv.willowgarage.com/wiki/Android2.3.0 , OpenCV 2.3.0 Release Candidate has a good support for Android. There is optical flow inside it.. used it
Although I am also trying to do the same, there seems to be more support for optical flow in OpenCV4Android now. Look at the APIs in org.opencv.video OpenCV Java documentation I see calcOpticalFlowPyrLK and calcOpticalFlowFarneback. I was able to get calcOpticalFlowFarneback to work (though the results did not seem that great, possibly need to tweak the parameters) calcOpticalFlowPyrLK is proving to be tricky. I cant seem to convert the keypoints returned by FeatureDetector class (MatOfKeyPoint) to points needed by calcOpticalFlowFarneback (MatOfPoint2f) other thread
This code will help you get the optical vectors. And it will track them
@Override public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
if (mMOP2fptsPrev.rows() == 0) {
//Log.d("Baz", "First time opflow");
// first time through the loop so we need prev and this mats
// plus prev points
// get this mat
Imgproc.cvtColor(mRgba, matOpFlowThis, Imgproc.COLOR_RGBA2GRAY);
// copy that to prev mat
matOpFlowThis.copyTo(matOpFlowPrev);
// get prev corners
Imgproc.goodFeaturesToTrack(matOpFlowPrev, MOPcorners, iGFFTMax, 0.05, 20);
mMOP2fptsPrev.fromArray(MOPcorners.toArray());
// get safe copy of this corners
mMOP2fptsPrev.copyTo(mMOP2fptsSafe);
}
else
{
//Log.d("Baz", "Opflow");
// we've been through before so
// this mat is valid. Copy it to prev mat
matOpFlowThis.copyTo(matOpFlowPrev);
// get this mat
Imgproc.cvtColor(mRgba, matOpFlowThis, Imgproc.COLOR_RGBA2GRAY);
// get the corners for this mat
Imgproc.goodFeaturesToTrack(matOpFlowThis, MOPcorners, iGFFTMax, 0.05, 20);
mMOP2fptsThis.fromArray(MOPcorners.toArray());
// retrieve the corners from the prev mat
// (saves calculating them again)
mMOP2fptsSafe.copyTo(mMOP2fptsPrev);
// and save this corners for next time through
mMOP2fptsThis.copyTo(mMOP2fptsSafe);
}
/*
Parameters:
prevImg first 8-bit input image
nextImg second input image
prevPts vector of 2D points for which the flow needs to be found; point coordinates must be single-precision floating-point numbers.
nextPts output vector of 2D points (with single-precision floating-point coordinates) containing the calculated new positions of input features in the second image; when OPTFLOW_USE_INITIAL_FLOW flag is passed, the vector must have the same size as in the input.
status output status vector (of unsigned chars); each element of the vector is set to 1 if the flow for the corresponding features has been found, otherwise, it is set to 0.
err output vector of errors; each element of the vector is set to an error for the corresponding feature, type of the error measure can be set in flags parameter; if the flow wasn't found then the error is not defined (use the status parameter to find such cases).
*/
Video.calcOpticalFlowPyrLK(matOpFlowPrev, matOpFlowThis, mMOP2fptsPrev, mMOP2fptsThis, mMOBStatus, mMOFerr);
cornersPrev = mMOP2fptsPrev.toList();
cornersThis = mMOP2fptsThis.toList();
byteStatus = mMOBStatus.toList();
y = byteStatus.size() - 1;
for (x = 0; x < y; x++) {
if (byteStatus.get(x) == 1) {
pt = cornersThis.get(x);
pt2 = cornersPrev.get(x);
Core.circle(mRgba, pt, 5, colorRed, iLineThickness - 1);
Core.line(mRgba, pt, pt2, colorRed, iLineThickness);
}
}
return mRgba;
}
精彩评论