适用于Android的OpenCV 2.4。Java和本机代码生产率之间的奇怪差异
类似这样的东西,用Java编写:适用于Android的OpenCV 2.4。Java和本机代码生产率之间的奇怪差异,android,opencv,android-ndk,computer-vision,Android,Opencv,Android Ndk,Computer Vision,类似这样的东西,用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上的工作速度比这快得多
// ...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();
为什么以及如何修复它?还有什么更好的方法呢?因为它是C语言。C语言比Java语言快得多,你无法修复它。如果您需要快速性能,请使用本机代码和NDK是的,这就是为什么它很奇怪。。。因为在我的例子中,C上的代码比Java上的慢得多:我相信Java端也使用了本机库,所以您的设置一定有问题。在Java中不能更快,因为您基本上从Java调用相同的C函数。