簡體   English   中英

在YUV_420_888中將圖像從Android發送到OpenCV Mat中的JNI的最有效方式

[英]Most Efficient way to send Image in YUV_420_888 from Android to JNI in OpenCV Mat

我有一個Android應用程序,我想在Android Camera2 API的實時圖像上運行一些OpenCV圖像處理。 目前,如果我不進行任何處理,我能夠以30 fps的速度接收常規1280x720幀的OnImageAvailble功能。

現在作為一個骯臟的黑客,我從ImageReader請求JPEG格式的圖像,然后將位圖傳遞給jni ,這會降低性能。

什么是在cv Mat對象中將YUV幀傳遞給jni的最有效方法。 另外,我想將此幀轉換為RGB以進行進一步處理。 我應該更改Java端的格式,還是應該將Mat對象傳遞給jni並僅轉換顏色空間。

由於顯而易見的原因,你在C ++中所做的任何事情都比Java等同得多,包括YUV到RGB的轉換(即使Java實現依賴於編譯庫)。

您可以直接將指針從Java中現有的Mat直接傳遞給C ++到JNI。 假設我想使用C ++和JNI做Canny(),我有一個像這樣定義的JNI函數:

// In Java
public static native boolean nativeCanny(long iAddr);

注意long iAddr參數,它是指向Java中Mat的直接指針。 你這樣調用它:

// In Java
nativeCanny(myImage.getNativeObjAddr());

在C ++中實現此函數將以與此類似的方式接收此指針(如果這不起作用,則用jlong​​替換long):

// 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中,畢竟它是一個指針,所以我們從來沒有復制過。

據我所知,這是最快的。

也許對您有所幫助:由於我們進行了大量的圖像處理,因此我們在公司為此目的編寫了一個庫。 它不是用C語言編寫的,而是非常高效的。 轉換后,您只需通過JNI將Mat指針傳遞給C代碼即可。

它將YUV(標准Android相機格式YUV_420_888)轉換為RGB Mats。 此外,它還允許在轉換之前有效剪切YUV(對於非常大的圖像很重要,否則你需要轉換整個圖像,然后剪輯這是昂貴的)。 用法很簡單:

Mat mat = Yuv.toMat(image)

https://github.com/quickbirdstudios/yuvToMat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM