Все, что вы делаете в C ++, намного быстрее, чем эквивалент Java по очевидным причинам, включая преобразования YUV в RGB (даже если реализация Java опирается на скомпилированные библиотеки).
Вы можете напрямую передать указатель из вашегоСуществующий Mat в Java напрямую в C ++ через JNI.Предположим, я хочу сделать Canny () с использованием C ++ и JNI, и у меня есть функция JNI, определенная следующим образом:
// In Java
public static native boolean nativeCanny(long iAddr);
Обратите внимание на параметр long iAddr , это прямой указатель на мойМат на Яве.Вы вызываете его так:
// In Java
nativeCanny(myImage.getNativeObjAddr());
Реализация этой функции в C ++ будет получать этот указатель аналогично этому (замените long на jlong, если это не работает):
// In C++
JNIEXPORT jboolean JNICALL
VeryLongName_nativeCanny(JNIEnv *env, jobject instance, long iAddr) {
cv::Mat* img = (cv::Mat*) iAddr;
cv::Canny(*img, *img, 80, 100, 3);
return true;
}
И все, что я сделал с img Mat, происходит и в java myImage Mat, в конце концов, это указатель, поэтому мы никогда не делали копию.
Насколько я знаю, это так быстро, как только может.