簡體   English   中英

將OpenCv Mat對象從Java傳遞到C Native

[英]Passing OpenCv Mat Object From Java to C Native

我正在嘗試通過opencv讀取圖像,然后將其從Java語言傳遞到由C語言而非C ++編寫的本機庫。 我正在使用JNI函數,並且已經看到許多使用Mat對象的c ++代碼示例。 但是我的問題是“ C語言”中沒有Mat對象,而我僅有的對象是CvMat。因此,當我用本機代碼獲取圖像時,這是錯誤的圖像。 我應該提到由於多種原因我不能使用c ++,而C是編寫本機代碼的唯一選擇。

我的Java代碼:

Mat img = Imgcodecs.imread("./mypic.jpg", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
myClass.getImg(img.getNativeObjAddr())

我的本機代碼:

JNIEXPORT jfloat JNICALL Java_PredictJNI_getImg
(JNIEnv *env, jobject thisObj, jlong imgPtr)
{
    CvMat* img = (CvMat*)imgPtr;
    printf("Image Width:%d:" , img->cols);
}

因此,請勿通過整個Mat結構。 僅將指針傳遞給原始數據。

//uchar* ptr2imgData = dynamic_cast<uchar *>( imgPtr );
//cv::Mat img( cv::Size{ WIDTH, HEIGHT }, CV_8UC3, ptr2imgData ); // C++

uchar* ptr2imgData = (uchar *)imgPtr;  // uchar is unsigned char
CvMat* img = cvCreateMat( WIDTH, HEIGHT, CV_8UC3 );
img->ptr = imgPtr;

如果矩陣類型和/或矩陣大小可能不同,請在其他參數中傳遞附加信息。 如果矩陣的類型始終相同,則將其保留為硬編碼並僅將指針傳遞給數據。

然后根據這些數據構造新的Mat

我從未編寫過Java語言,但我為此感到自豪-無論如何,我知道沒有指針。 我發現您可以使用get()方法

myClass.getImg(img.get(0, 0)); // Beginning of the array

或您提到的getNativeObjAddr()方法

myClass.getImg(img.getNativeObjAddr());

您的解決方案無法工作,並且會調用未定義的行為,因為cvMatMat是完全不同的類型。

暫無
暫無

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

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