android - imread在Android的OpenCV中不起作用

标签 android opencv

这是我的代码:

package com.example.edgedetection;

import java.io.File;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
private BaseLoaderCallback  mOpenCVCallBack = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                    case LoaderCallbackInterface.SUCCESS:
                    {

                    } break;
                    default:
                    {
                        super.onManagerConnected(status);
                    } break;
                }
        }
        };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        double scale = 0.1;
        imageview =  (ImageView)this.findViewById(R.id.image_view);
        Bitmap bm1=BitmapFactory.decodeFile("/mnt/sdcard/test1.bmp");
        imageview.setImageBitmap(bm1);
        Mat img = Highgui.imread("/mnt/sdcard/test1.bmp",1);

        Size dsize = new Size(img.width()*scale,img.height()*scale);
        Mat img2 = new Mat(dsize,CvType.CV_8SC1);
        Mat img3 = new Mat();
        img.convertTo(img2, CvType.CV_8SC1);
        Imgproc.Canny(img, img3, 123, 250);

        boolean flag=Highgui.imwrite("mnt/sdcard/new.jpg", img3);
        if(flag)
        {
            File f = new File("mnt/sdcard/new.jpg");
            if(f.exists())
            {
                Bitmap bm=BitmapFactory.decodeFile("mnt/sdcard/new.jpg");
                imageview.setImageBitmap(bm);
            }
        }//end if
        else{
        Toast.makeText(MainActivity.this, "===========fail to write!============!!", 3).show();
        }
    }

    @Override
    public void onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mOpenCVCallBack);
    }
}

我已经将OpenCV 2.4.9导入到我的项目中。当我尝试在Nexus 4上运行它时,它显示如下:
java.lang.UnsatisfiedLinkError: No implementation found for long
org.opencv.highgui.Highgui.imread_0(java.lang.String,int) (tried 
Java_org_opencv_highgui_Highgui_imread_10 and 
Java_org_opencv_highgui_Highgui_imread_10_Ljava_lang_String_2I)

有人可以帮我吗?

最佳答案

请将该代码从onCreate()移至onCameraViewStarted()或移至

case LoaderCallbackInterface.SUCCESS:
{
}

括号。

您不能在完成加载之前(即,(异步)mOpenCVCallBack完成之后)使用opencv代码。

关于android - imread在Android的OpenCV中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24597805/

相关文章:

c++ - 提高图像对比度

python - 如何使用 cv2.rectangle() 创建随机颜色边界框

c++ - OpenCV 错误 : Assertion failed in matrix. cpp 第 522 行,/matrix.cpp:522:错误:(-215)

algorithm - 人们如何证明计算机视觉方法的正确性?

java - 跨时间修改一个Runnable类属性

java - 当屏幕旋转时,用户可以欺骗 Android

android - 如何在android中显示从上到下的渐变效果

android - 在代码中定义选择器

android - 如何从 "disk"读取 NinePatch 图像并将其转换为 NinePatchDrawable?

c++ - OpenCV 慢相机帧率