Передача объекта OpenCv Mat с Java на собственный C - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь прочитать изображение с помощью opencv, а затем передать его с языка Java в мою родную библиотеку, написанную на языке C, а не C ++.Я использую функцию JNI, и я видел много примеров кода C ++, в котором используется Mat Object.но моя проблема в том, что в языке «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);
}

1 Ответ

0 голосов
/ 23 декабря 2018

Так что не передавайте всю структуру 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 - это совершенно разные типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...