android - Android:初学者使用Opencv库(转换为opencv格式)

标签 android opencv bitmap mat

我在Android上使用opencv库时遇到问题。我尝试将imageview转换为位图,然后将位图转换为mat(用于opencv进程),然后再次将其转换为位图。但是我在运行程序时得到了强制选择。这是我的代码:

public class MainActivity extends Activity {

protected static final String TAG = null;
ImageView img;
Button btn;

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
       switch (status) {
           case LoaderCallbackInterface.SUCCESS:
           {
          Log.i(TAG, "OpenCV loaded successfully");
          // Create and set View
          setContentView(R.layout.activity_main);
           } break;
           default:
           {
          super.onManagerConnected(status);
           } break;
       }
     }
};

@Override
public void onResume() {
    super.onResume();
    LoaderCallbackInterface mLoaderCallback = null;
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}   

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //convert imageview to bitmap
    img =(ImageView) findViewById(R.id.imageView1);
    BitmapDrawable drawable = (BitmapDrawable) img.getDrawable();
    final Bitmap imgbitmap = drawable.getBitmap();

    btn=(Button) findViewById(R.id.button1);
    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            //convert Bitmap to Mat
            Mat ImageMat = new Mat ( imgbitmap.getHeight(), imgbitmap.getWidth(), CvType.CV_8U, new Scalar(4));
            Bitmap myBitmap32 = imgbitmap.copy(Bitmap.Config.ARGB_8888, true);
            Utils.bitmapToMat(myBitmap32, ImageMat);

            //convert to grayscale
            Imgproc.cvtColor(ImageMat, ImageMat, Imgproc.COLOR_RGB2GRAY,4);

            //Then convert the processed Mat to Bitmap
            Bitmap resultBitmap = Bitmap.createBitmap(ImageMat.cols(),  ImageMat.rows(),Bitmap.Config.ARGB_8888);;
            Utils.matToBitmap(ImageMat, resultBitmap);


            //convert bitmap to imageview 
            ImageView imgbit;
            imgbit = (ImageView) findViewById(R.id.imageView2);
            imgbit.setImageBitmap(resultBitmap);
        }
    });        
}
}

这是我的日志:
12-09 16:27:23.052: D/dalvikvm(7837): Debugger has detached; object registry had 1 entries
12-09 16:27:23.582: D/dalvikvm(7837): GC_EXTERNAL_ALLOC freed 50K, 45% free 3007K/5379K, external 733K/1041K, paused 359ms
12-09 16:27:23.762: D/InputQueue(7837): Registering input channel '2b3941f0 com.gozur.latihanpcd/com.gozur.latihanpcd.MainActivity (client)'
12-09 16:27:23.812: I/FihConfig(7837): can not find this tag <SYSTEM_CUST_HANDWRITING>in the mUsedConfigData Array
12-09 16:27:38.492: D/dalvikvm(7990): GC_EXTERNAL_ALLOC freed 47K, 45% free 3007K/5379K, external 733K/1041K, paused 85ms
12-09 16:27:38.582: D/InputQueue(7990): Registering input channel '2b014008 com.gozur.latihanpcd/com.gozur.latihanpcd.MainActivity (client)'
12-09 16:27:38.642: I/FihConfig(7990): can not find this tag <SYSTEM_CUST_HANDWRITING>in the mUsedConfigData Array
12-09 16:27:40.362: D/WindowManager(7990): MotionEvent obtain 1 : MotionEvent{2afc4910 action=0 x=58.0 y=13.0 pressure=1.0 size=0.0}
12-09 16:27:40.492: W/dalvikvm(7990): No implementation found for native Lorg/opencv/core/Mat;.n_Mat (IIIDDDD)J
12-09 16:27:40.492: D/AndroidRuntime(7990): Shutting down VM
12-09 16:27:40.492: W/dalvikvm(7990): threadid=1: thread exiting with uncaught exception (group=0x2aacc560)
12-09 16:27:40.502: E/AndroidRuntime(7990): Uncaught handler: thread main exiting due to uncaught exception
12-09 16:27:40.532: W/System.err(7990): java.io.FileNotFoundException: /data/logcat_0.txt (Permission denied)
12-09 16:27:40.532: E/AndroidRuntime(7990): FATAL EXCEPTION: main
12-09 16:27:40.532: E/AndroidRuntime(7990): java.lang.UnsatisfiedLinkError: n_Mat
12-09 16:27:40.532: E/AndroidRuntime(7990):     at org.opencv.core.Mat.n_Mat(Native Method)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at org.opencv.core.Mat.<init>(Mat.java:535)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at com.gozur.latihanpcd.MainActivity$1.onClick(MainActivity.java:66)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at android.view.View.performClick(View.java:2494)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at android.view.View$PerformClick.run(View.java:9109)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at android.os.Handler.handleCallback(Handler.java:587)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at android.os.Looper.loop(Looper.java:130)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at android.app.ActivityThread.main(ActivityThread.java:3683)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at java.lang.reflect.Method.invokeNative(Native Method)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at java.lang.reflect.Method.invoke(Method.java:507)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
12-09 16:27:40.532: E/AndroidRuntime(7990):     at dalvik.system.NativeStart.main(Native Method)
12-09 16:27:40.572: W/System.err(7990): java.io.FileNotFoundException: /data/plog.log (Permission denied)

最佳答案

我非常怀疑您的代码能否在将图像转换为灰度之前显示图像的原始版本,因为您的日志猫错误说

 No implementation found for native Lorg/opencv/core/Mat

这意味着您在调用opencv API之前尚未完成静态初始化
 static {
    if (!OpenCVLoader.initDebug()) 
       {
        // Handle initialization error
    } }

请按照here的步骤3和4进行操作。

关于android - Android:初学者使用Opencv库(转换为opencv格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466001/

相关文章:

android - 检查 broadcstreceiver 是否已注册?

c++ - 在 OpenCV 中使用 inRange() 检测范围内的颜色

c++ - 接近矩形的轮廓

android - 尽管值在 getPreviewFpsRange 的范围内,但 setPreviewFpsRange 不工作

android - Android 中的倒数计时器

android - 如何在没有 Logcat 应用程序的情况下在 Android 智能手机中查找 Activity 日志文件?

c++ - 使用 openCV 从 xml 文件读取和显示矩阵

android - 如何从另一个位图中剪切一个位图

android - 在Android中以编程方式放大图片

java - 在 Android 中存储和显示图像的最佳方式