我正在使用 Opencv sdk for Android 开发实时处理和匹配。
主要的 Opencv 特征逻辑在一个JNI函数中。
问题是有时(只是有时)我的应用程序崩溃没有错误,所以我忽略了这个问题,直到我完成了算法的开发。
我开始调查错误,它肯定在 JNI 部分。
这是我在 Log
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 27424 (Thread-8)
A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
Run Code Online (Sandbox Code Playgroud)
我在互联网上搜索了很多,我找到了这个解决方案
<activity
android:hardwareAccelerated="false" />
Run Code Online (Sandbox Code Playgroud)
它工作了 2 天,现在我又得到了同样的错误。
有什么问题,我该如何解决?
任何帮助将不胜感激,并提前感谢您。
编辑
我应该补充一点,我的应用程序从图库中获取参考图像,并使用 Opencv 将其与实时图像源进行比较。
如果我从图库中选择一个图像并且应用程序崩溃,该图像将无法再次工作,如果我拍摄新图像或以前工作过的图像,该应用程序工作正常。
java-native-interface android segmentation-fault android-ndk opencv4android
我是java android开发人员,我不太了解C/C++或Matlab函数.在我的代码中做的很简单的事情就是创建sift/Surf图像细节并在.yml文件中保存细节.
这是我如何创建筛选的代码
vector < KeyPoint > keypoints;
Mat descriptors;
// Create a SIFT keypoint detector.
SiftFeatureDetector detector;
detector.detect(image, keypoints);
LOGI("Detected %d keypoints\n", (int) keypoints.size());
// Compute feature description.
detector.compute(image, keypoints, descriptors);
Run Code Online (Sandbox Code Playgroud)
将结果描述符保存在(.yml)文件中,然后使用OpenCV的FlannBasedMatcher比较yml文件
这是我的代码
descriptors1&descriptors2是从.yml文件创建的两个mat对象.
FlannBasedMatcher matcher;
vector<double> ee;
vector < DMatch > good_matches;
double good_matches_sum = 0.0;
vector < vector<DMatch> > matches;
matcher.knnMatch(descriptors1, descriptors2, matches, 2);
for (int i = 0; i < matches.size(); i++) {
if (matches[i][0].distance < 0.8 * matches[i][1].distance) {
good_matches.push_back(matches[i][0]);
good_matches_sum += matches[i][0].distance;
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一种可以用相机扫描Passport页面的扫描仪.
我想裁掉标记的部分.
我已经编写了使用OpenCV进行边缘检测的代码,它可以找到轮廓,然后近似最大的四边形.最后,它进行了4点透视转换,以获得图像的俯视图.边缘检测代码如下所示:
public static List<MatOfPoint> findContours(Mat src){
Mat img = src.clone();
src.release();
//find contours
double ratio = getScaleRatio(img.size());
int width = (int) (img.size().width / ratio);
int height = (int) (img.size().height / ratio);
Size newSize = new Size(width, height);
Mat resizedImg = new Mat(newSize, CvType.CV_8UC4);
Imgproc.resize(img, resizedImg, newSize);
Imgproc.medianBlur(resizedImg, resizedImg, 5);
Mat cannedImg = new Mat(newSize, CvType.CV_8UC1);
Imgproc.Canny(resizedImg, cannedImg, 70, 200, 3, true);
resizedImg.release();
Imgproc.threshold(cannedImg, cannedImg, 200, 255, Imgproc.THRESH_OTSU);
Mat dilatedImg = new Mat(newSize, CvType.CV_8UC1);
Mat morph = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, …Run Code Online (Sandbox Code Playgroud) 我想创建一个Android应用程序,它使用原生(使用C++)BOW + SVM进行预测.不幸的是我在构建原生部分时遇到了问题.由于OpenCV SDK for Android中不包含非免费模块,因此我需要使用本教程自行构建模块.好像我成功构建了.so文件.这是输出:
[armeabi-v7a] Prebuilt : libopencv_java.so <= /home/crash-id/Development/SDK/OpenCV-2.4.9-android-sdk/sdk/native/jni/../libs/armeabi-v7a/
[armeabi-v7a] SharedLibrary : libnonfree.so
[armeabi-v7a] Install : libnonfree.so => libs/armeabi-v7a/libnonfree.so
[armeabi-v7a] Install : libopencv_java.so => libs/armeabi-v7a/libopencv_java.so
Run Code Online (Sandbox Code Playgroud)
所以当我必须将这个.so文件添加到我的项目时,问题就出现了.我将libnonfree.so添加到了我的jni文件夹中.然后我编辑了Android.mk.在这里,我提供我的.mk文件.
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nonfree_prebuilt
LOCAL_SRC_FILES := libnonfree.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES := on
OPENCV_INSTALL_MODULES := on
include /home/crash-id/Development/SDK/OpenCV-2.4.9-android-sdk/sdk/native/jni/OpenCV.mk
#LOCAL_SHARED_LIBRARIES := nonfree_prebuilt #if I add this, it says undefined reference for everything in the cv namespace.
LOCAL_SRC_FILES := SVMDetector.cpp
LOCAL_MODULE := svm_detector
LOCAL_C_INCLUDES …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的应用程序中开发文档扫描程序.作为我想要实现的目标的一个示例,您可以查看Google云端硬盘应用中内置的Google文档扫描程序.
这允许
我一直在寻找一些第三方api,看看是否可以实现这一点,但他们似乎更专注于OCR.这不是我的优先事项.
然而,我偶然发现了这个文件扫描仪
它使用java打开cv制作文档扫描程序的位置.在评论中有人问到将这个移植到Android应用程序的可能性.显然这是可能的.
我已经研究过在我的IDE(android studio)中导入open cv库.这也是可能的.
由于我之前没有这样做,如果有人能帮助我找出任何可能帮助我实现目标的潜在问题或替代实施,我将不胜感激.
我渴望在可能的情况下依靠第三方来自己开发
我已经在ImageView中实现了FloodFill算法的实现。但是我无法在Camera(Android的Surface View)上实现它。我正在使用OpenCV库。我已经使用轮廓概念尝试了以下代码。但是我没有得到确切的结果。
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
if (mIsColorSelected) {
mDetector.process(mRgba);
List<MatOfPoint> contours = mDetector.getContours();
Log.e(TAG, "Contours count: " + contours.size());
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
Imgproc.drawContours(mRgba, contours, contourIdx, new Scalar(0,
0, 100, 10), -1);
}
Mat colorLabel = mRgba.submat(4, 68, 4, 68);
colorLabel.setTo(mBlobColorRgba);
Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70,
70 + mSpectrum.cols());
mSpectrum.copyTo(spectrumLabel);
}
return mRgba;
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道该怎么做。提前致谢。
android opencv image-processing opencv4android opencv-contour
我正在使用Android OpenCV构建实时对象检测应用程序.我正在使用带有TextureView的Android Camera2 API来捕获图像.我想添加OpenCV代码来进行一些实时图像处理并预览结果.
这是我的拍照代码
protected void takePicture() {
if(null == cameraDevice) {
Log.e(TAG, "cameraDevice is null");
return;
}
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId());
Size[] jpegSizes = null;
if (characteristics != null) {
jpegSizes = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.JPEG);
}
int width = 640;
int height = 480;
if (jpegSizes != null && 0 < jpegSizes.length) {
width = jpegSizes[0].getWidth();
height = jpegSizes[0].getHeight();
}
ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
List<Surface> outputSurfaces = new ArrayList<Surface>(2);
outputSurfaces.add(reader.getSurface()); …Run Code Online (Sandbox Code Playgroud) 我正在使用Android Studio 2.2的Android项目中使用OpenCV 3.1.0库.我根据这个答案导入了库.情况如下:
Gradle日志
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithInstantRunForDebug'.
> java.lang.ClassNotFoundException: android.hardware.camera2.CameraAccessException
* Try:
Run with --info or --debug option to get more log output.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithInstantRunForDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)...
Run Code Online (Sandbox Code Playgroud)
我发现了类似的问题:
在他们两个中,解决方案是将compileSdkVersion最小值设置为21(camera2引入API 的版本),并确保build.gradle项目和OpenCV的文件匹配.
不幸的是,它对我不起作用.我仍然得到同样的错误.任何的想法?
我的代码在这里可用:Github存储库.
谢谢你的帮助!
我已将 OpenCV 模块依赖项从 3.4.3 更新到 4.1.1,现在我收到消息
未找到 OpenCV 管理器包
尽管我已经包含了所有 libopencv_java4.so 本机库。
在以前的版本 (3.4.x) 中,仅当我省略包含本机*.so库时才需要包管理器,但在这个版本 (4.1.1) 中似乎没有任何区别,无论如何每次都要求 OpenCV 管理器。
我不希望该应用程序依赖于单独的 OpenCV 管理器。我该如何解决这个错误?
错误日志是:
OpenCV error: Cannot load info library for OpenCV
W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
W/System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1071)
W/System.err: at java.lang.Runtime.loadLibrary0(Runtime.java:1007)
W/System.err: at java.lang.System.loadLibrary(System.java:1667)
W/System.err: at org.opencv.android.StaticHelper.loadLibrary(StaticHelper.java:64)
W/System.err: at org.opencv.android.StaticHelper.initOpenCVLibs(StaticHelper.java:95)
W/System.err: at org.opencv.android.StaticHelper.initOpenCV(StaticHelper.java:39)
W/System.err: at org.opencv.android.OpenCVLoader.initDebug(OpenCVLoader.java:107)
W/System.err: at com.mysite.myapp.OpenCVTestActivity.onResume(OpenCVTestActivity.java:144)
W/System.err: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1446)
W/System.err: at android.app.Activity.performResume(Activity.java:7939)
W/System.err: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4195)
W/System.err: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237)
W/System.err: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我正在做一些图像像素操作.我的代码基于这个例子.
我所做的唯一改变是将其更改FRAGMENT_SHADER为灰度,它看起来像这样:
private static final String FRAGMENT_SHADER =
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;\n" + // highp here doesn't seem to matter
"varying vec2 vTextureCoord;\n" +
"uniform samplerExternalOES sTexture;\n" +
"void main() {\n" +
" vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
" gl_FragColor.r = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
" gl_FragColor.g = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
" gl_FragColor.b = …Run Code Online (Sandbox Code Playgroud)