![](/img/trans.png)
[英]Create Mat object in a Java client, sent from a C++ server using opencv
[英]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());
您的解決方案無法工作,並且會調用未定義的行為,因為cvMat
和Mat
是完全不同的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.