При вызове из Java комбинация goodFeaturesToTrack+calcOpticalFlowPyrLK работает намного более быстрее, чем если ее же вызывать в нативе, хотя ,по идее, должно быть наоборот. Вот нативный код:
bool first = true;
//arguments for goodFeatures
int maxCorners = 23;
double qualityLevel = 0.1;
double minDistance = 10;
int blockSize = 2;
bool useHarrisDetector = false;
double k = 0.04;
//arguments for lucas-kanade cpp
vector<uchar> status;
vector<float> track_error;
Size winSize(5, 5);
int maxLevel = 2;
TermCriteria tc(TermCriteria::COUNT + TermCriteria::EPS, 5, 0.1);
double derivLambda = 0;
int flags = 0;
vector<Point2f> vprev;
vector<Point2f> vnew;
vector<Point2f> vprevNow;
extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4View_FindFeatures(JNIEnv* env, jobject thiz, jlong addrGray, jlong addrRgba, jlong addrPrevGray)
{
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();
}
}
Подскажите, пожалуйста, где ошибка или что можно оптимизировать. jni_part.cpp