OpenCV Mat 处理 Android JNI
OpenCV Mat processing Android JNI
我目前正在使用 OpenCv Android API 和 JNI 开发一些东西以加快处理速度。
目前,程序从设备相机获取一帧,并将 RGBA 矩阵转发给 JNI 接口的 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++ 等价物解决了这个问题
我找不到您在定义 "grey" 时使用的任何构造函数。你能用下面的方法改变它吗?
grey = new cv::Mat(frame_size, CV_8UC1);
希望对您有所帮助。
抱歉,这段 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++ 函数..
我目前正在使用 OpenCv Android API 和 JNI 开发一些东西以加快处理速度。
目前,程序从设备相机获取一帧,并将 RGBA 矩阵转发给 JNI 接口的 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++ 等价物解决了这个问题
我找不到您在定义 "grey" 时使用的任何构造函数。你能用下面的方法改变它吗?
grey = new cv::Mat(frame_size, CV_8UC1);
希望对您有所帮助。
抱歉,这段 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++ 函数..