0

像这样,用Java编写的:

// ...preparing inputs
Imgproc.goodFeaturesToTrack(curImage, prevPts, NUM_OF_PTS, 0.001, 10);
// ...
Video.calcOpticalFlowPyrLK(prevImage, curImage, prevPts2f, nextPts2f, status, err);
// ... visualization, Core.circle

在 C 上比这快得多:

Mat* now=(Mat*)addrGray;
Mat* frame=(Mat*)addrRgba;
Mat* prev=(Mat*)addrPrevGray;

goodFeaturesToTrack( *now,
        vnew,
        maxCorners,
        qualityLevel,
        minDistance,
        Mat(),
        blockSize,
        useHarrisDetector,
        k );
for( size_t i = 0; i < vnew.size(); i++ ) {
    circle(*frame, Point(vnew[i].x, vnew[i].y), 10, Scalar(255,0,0,255));
}
calcOpticalFlowPyrLK(*prev, *now, vprev, vprevNow, status, track_error, winSize, maxLevel, tc, derivLambda,flags);
vprev.clear();
vector<Point2f>::iterator iter=vnew.begin();
while (iter != vnew.end()) {
    vprev.push_back(*iter);
    ++iter;
}
vnew.clear();
vprevNow.clear();

为什么以及如何解决?或者有什么更好的方法?

4

1 回答 1

0

因为它是 C。C 比 Java 快得多,你无法修复它。如果您需要快速性能,请使用本机代码和 NDK

于 2012-04-22T20:24:56.747 回答