java - OpenCV Mat 处理 Android JNI

标签 java android c++ opencv matrix

我目前正在使用 OpenCv 的 Android API 和 JNI 开发一些东西,以实现更快的处理。

目前,程序从设备摄像头获取帧,然后将 RGBA 矩阵转发给 JNI 接口(interface)的 C++ 算法。

这通常有效,但是当尝试以任何方式处理矩阵时,我会收到 SIGABRT -6 错误,并显示以下跟踪:

D/JNI/LaneDetection(15547): Processing frame
D/JNI/LaneDetection(15547): frame type: 24
D/JNI/LaneDetection(15547): frame rows, cols: 1080, 1920
D/JNI/LaneDetection(15547): grey_frame type: 24
D/JNI/LaneDetection(15547): grey_frame rows, cols: 1080, 1920
I/DEBUG   (  242):     #00 pc 00036d58  /system/lib/libc.so (tgkill+12)
I/DEBUG   (  242):     #01 pc 00014231  /system/lib/libc.so (pthread_kill+52)
I/DEBUG   (  242):     #02 pc 00014f93  /system/lib/libc.so (raise+10)
I/DEBUG   (  242):     #03 pc 000116a5  /system/lib/libc.so (__libc_android_abort+36)
I/DEBUG   (  242):     #04 pc 0000fd3c  /system/lib/libc.so (abort+4)
I/DEBUG   (  242):     #05 pc 00724ce4  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (__gnu_cxx::__verbose_terminate_handler()+276)
I/DEBUG   (  242):     #06 pc 007220e8  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (__cxxabiv1::__terminate(void (*)())+8)
I/DEBUG   (  242):     #07 pc 0072212c  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (std::terminate()+20)
I/DEBUG   (  242):     #08 pc 007222b4  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (__cxa_throw+148)
I/DEBUG   (  242):     #09 pc 001a5a41  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (cv::error(cv::Exception const&)+80)
I/DEBUG   (  242):     #10 pc 00267243  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (cv::cvarrToMat(void const*, bool, bool, int)+134)
I/DEBUG   (  242):     #11 pc 0035bcbb  /data/app/at.sapps.sdo-2/lib/arm/libopencv_java.so (cvCvtColor+22)
I/DEBUG   (  242):     #12 pc 00006195  /data/app/at.sapps.sdo-2/lib/arm/liblane_tracker_module.so (onFrame(cv::Mat*)+252)

导致错误的相应 C++ 调用如下:

cvCvtColor(frame, grey, CV_RGBA2GRAY); // convert to grayscale

您可能已经注意到,矩阵类型和维度是相同的。我也尝试过 CV_BGRA2GRAY ,结果相同。 (但是,我很确定它是一个 RGBA 矩阵,因为 javaapi 调用是 inputframe.rgba() 来获取矩阵..)

Mat 灰色通过以下调用进行初始化:

    Mat *grey = new Mat(frame_size, 24); // global, 24=type= same as original frame Mat
    // method init:
    video_size.height = frame->rows;
    video_size.width = frame->cols;
    frame_size = cvSize(video_size.width, video_size.height);
    grey = new cv::Mat(frame_size, 24, 3);

我无法弄清楚实际问题是什么,可能是因为我缺乏 C++ 技能。

我感谢每一个帮助并提前感谢您。

Java代码简而言之:

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
 rgbaMat = inputFrame.rgba();
 nativeDetect(rgbaMat.getNativeObjAddr(), lanes.getNativeObjAddr());
 return rgbaMat;
}


private static native void nativeDetect(long inputImage, long lanes);

解答:使用的 C 方法是万恶之源。将它们更改为 C++ 等效项解决了此问题

最佳答案

抱歉,这个 C++ 代码让我感到困惑。构造函数中的 24 或 3 是什么类型...我认为,你应该使用 OpenCV 常量来定义类型。另外,您正在使用 C 函数而不是 C++ 函数

无论如何,方法cv::cvtColor应该分配必要的内存,你只需要做:

Mat grey;
cv::cvtColor(frame, grey, CV_RGBA2GRAY);

最后,我会克隆您的输入框架 (frame) 以避免 Android 代码出现内存问题:

cv::Mat newMat = frame.clone()

搜索doc查找 C++ 函数..

关于java - OpenCV Mat 处理 Android JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28811132/

相关文章:

android - 如何下载和构建 libijs 源?

安卓靠背模式

android - 拥有 LLVM IR 库如何从 Ubuntu 交叉编译到 iOS、Android、Windows 和 Mac?

c++ - 如何正确链接?

c++ - 从文件到变量?

java - 如何绘制图形数组

java - 生产者和消费者在 Java 中使用锁

java - 将引用类型作为参数传递并使用泛型

java - 在 Java 中将函数应用于 while 循环

c++ - 为什么我必须在覆盖 [C++] 时重新声明一个虚函数