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