2014-03-05 28 views
0

我得到一個運行時空白屏幕在android + opencv的距離變換我使用「mRgba = inputframe.rgba();」從攝像頭獲取輸入信息,而不是我進行閾值和所有距離轉換工作。我不知道在哪裏什麼是錯的任何人都可以請回答我錯誤在運行時空白屏幕在opencv + android的距離變換

我的代碼是事先下面

感謝名單給

package com.example.lastdemo; 

import java.util.ArrayList; 
import java.util.List; 

import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.Core; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.core.MatOfPoint; 
import org.opencv.imgproc.Imgproc; 
import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Color; 
import android.util.Log; 
import android.view.Menu; 
import android.view.SurfaceView; 
import android.view.WindowManager; 


public class MainActivity extends Activity implements CvCameraViewListener2 { 

    private static final String TAG = "OCVSample::Activity"; 

    public Bitmap newBitmap,bitmap; 
    public int no; 
    public Mat mBin = new Mat(),dist_8u; 
    public Bitmap bmpBinary; 
    public Mat imageMat; 
    public List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
    public Mat hierarchy = new Mat(); 

    public Mat mRgba = new Mat(); 
    public Mat mGray = new Mat(); 
    public Mat mTemp = new Mat(); 

    private CameraBridgeViewBase mOpenCvCameraView; 


    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        Log.i(TAG, "OpenCV loaded successfully"); 
        mOpenCvCameraView.enableView(); 
        //mOpenCvCameraView.setOnTouchListener(MainActivity.this); 
       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 

    public MainActivity() { 
     Log.i(TAG, "Instantiated new " + this.getClass()); 
    }  
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Log.i(TAG, "called onCreate"); 
     super.onCreate(savedInstanceState); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setContentView(R.layout.tutorial1_surface_view); 
     mOpenCvCameraView = (CameraBridgeViewBase) findViewById (R.id.tutorial1_activity_java_surface_view); 
     mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
     mOpenCvCameraView.setCvCameraViewListener(this); 


    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

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

    public void onDestroy() { 
     super.onDestroy(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

    public void onCameraViewStarted(int width, int height) { 
     mGray = new Mat(); 
     mRgba = new Mat(); 

    } 

    public void onCameraViewStopped() { 
    } 

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
     mRgba = inputFrame.rgba(); 
     Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_BGRA2GRAY); 

    /*Bitmap resultBitmap = Bitmap.createBitmap(mGray.cols(), mGray.rows(),Bitmap.Config.ARGB_8888);; 
    Utils.matToBitmap(mGray, resultBitmap); 
     Bitmap mResult = resultBitmap; 

    toBinary(mResult); 

    imageMat = new Mat(bmpBinary.getHeight(), bmpBinary.getWidth(), CvType.CV_8U,new Scalar(4)); 
    Bitmap myBitmap32 = bmpBinary.copy(Bitmap.Config.ARGB_8888, true); 
    Utils.bitmapToMat(myBitmap32, imageMat);*/ 



     Imgproc.threshold(mGray, mBin, 40, 255, Imgproc.THRESH_BINARY); 
     //Imgproc.distanceTransform_0(imageMat.nativeObj, mTemp.nativeObj, Imgproc.DIST_LABEL_PIXEL, 3); 
     Imgproc.distanceTransform(mBin, mTemp, Imgproc.DIST_LABEL_PIXEL, 3); 
     Core.normalize(mTemp, mBin, 0, 1., Core.NORM_MINMAX); 
     Imgproc.threshold(mBin, mBin, .5, 1., Imgproc.THRESH_BINARY); 
     mBin.convertTo(dist_8u, CvType.CV_8U); 
     hierarchy = new Mat(); 
     Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
     no = contours.size(); 

     return dist_8u; 

    } 

    public void toBinary(Bitmap mGray) { 

     int width, height, threshold; 
     height = mGray.getHeight(); 
     width = mGray.getWidth(); 
     threshold = 32; 
     bmpBinary = Bitmap.createBitmap(mGray); 

     for(int x = 0; x < width; ++x) { 
      for(int y = 0; y < height; ++y) { 
       // get one pixel color 
       int pixel = mGray.getPixel(x, y); 
       int red = Color.red(pixel); 

       //get binary value 
       if(red < threshold){ 
        bmpBinary.setPixel(x, y, 0xFF000000); 
       } else{ 
        bmpBinary.setPixel(x, y, 0xFFFFFFFF); 
       } 

      } 
     } 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 
+0

請忽略toBinary()方法時什麼也沒有 – Div

回答

0

我已經按照你但還是同樣的黑屏問題做出改變......

package com.example.lastdemo; 

import java.util.ArrayList; 
import java.util.List; 
import org.opencv.android.BaseLoaderCallback; 
import org.opencv.android.CameraBridgeViewBase; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; 
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; 
import org.opencv.android.LoaderCallbackInterface; 
import org.opencv.android.OpenCVLoader; 
import org.opencv.core.Core; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.core.MatOfPoint; 
import org.opencv.imgproc.Imgproc; 
import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Color; 
import android.util.Log; 
import android.view.Menu; 
import android.view.SurfaceView; 
import android.view.WindowManager; 


public class MainActivity extends Activity implements CvCameraViewListener2 { 

    private static final String TAG = "OCVSample::Activity"; 

    public Bitmap newBitmap,bitmap; 
    public int no; 
    public Mat mBin,dist_8u; 
    public Bitmap bmpBinary; 
    public Mat imageMat; 
    public List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
    public Mat hierarchy; 

    public Mat mRgba; 
    public Mat mGray; 
    public Mat mTemp,mTemp1; 

    private CameraBridgeViewBase mOpenCvCameraView; 


    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        Log.i(TAG, "OpenCV loaded successfully"); 
        mOpenCvCameraView.enableView(); 
        //mOpenCvCameraView.setOnTouchListener(MainActivity.this); 
       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 

    public MainActivity() { 
     Log.i(TAG, "Instantiated new " + this.getClass()); 
    }  
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Log.i(TAG, "called onCreate"); 
     super.onCreate(savedInstanceState); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
     setContentView(R.layout.tutorial1_surface_view); 
     mOpenCvCameraView = (CameraBridgeViewBase) findViewById (R.id.tutorial1_activity_java_surface_view); 
     mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); 
     mOpenCvCameraView.setCvCameraViewListener(this); 


    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

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

    public void onDestroy() { 
     super.onDestroy(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

    public void onCameraViewStarted(int width, int height) { 
     mGray = new Mat(); 
     mRgba = new Mat(); 

    } 

    public void onCameraViewStopped() { 
    } 

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 

     mRgba = inputFrame.rgba(); 
     Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_BGRA2GRAY); 

    /*Bitmap resultBitmap = Bitmap.createBitmap(mGray.cols(), mGray.rows(),Bitmap.Config.ARGB_8888);; 
    Utils.matToBitmap(mGray, resultBitmap); 
     Bitmap mResult = resultBitmap; 

    toBinary(mResult); 

    imageMat = new Mat(bmpBinary.getHeight(), bmpBinary.getWidth(), CvType.CV_8U,new Scalar(4)); 
    Bitmap myBitmap32 = bmpBinary.copy(Bitmap.Config.ARGB_8888, true); 
    Utils.bitmapToMat(myBitmap32, imageMat);*/ 



     Imgproc.threshold(mGray, mBin, 40, 255, Imgproc.THRESH_BINARY); 
     //Imgproc.distanceTransform_0(imageMat.nativeObj, mTemp.nativeObj, Imgproc.DIST_LABEL_PIXEL, 3); 
     Imgproc.distanceTransform(mBin, mTemp, Imgproc.DIST_LABEL_PIXEL, 3); 
     Core.normalize(mTemp, mBin, 0, 1., Core.NORM_MINMAX); 
     Imgproc.threshold(mBin, mBin, .5, 1., Imgproc.THRESH_BINARY); 
     mBin.convertTo(dist_8u, CvType.CV_8U); 
     mTemp1 = dist_8u; 
     hierarchy = new Mat(); 
     Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
     no = contours.size(); 

     return mTemp1; 


    /*Bitmap resultBitmap = Bitmap.createBitmap(mGray.cols(), mGray.rows(),Bitmap.Config.ARGB_8888);; 
    Utils.matToBitmap(mGray, resultBitmap); 
     Bitmap mResult = resultBitmap; 

    toBinary(mResult); 

    imageMat = new Mat(bmpBinary.getHeight(), bmpBinary.getWidth(), CvType.CV_8U,new Scalar(4)); 
    Bitmap myBitmap32 = bmpBinary.copy(Bitmap.Config.ARGB_8888, true); 
    Utils.bitmapToMat(myBitmap32, imageMat);*/ 

/*  Imgproc.cvtColor(imageMat, mRgba, Imgproc.COLOR_BayerBG2BGR); 
     Imgproc.threshold(imageMat, imageMat, 40, 255, Imgproc.THRESH_BINARY); 
     Imgproc.distanceTransform(imageMat, mTemp, Imgproc.DIST_LABEL_PIXEL, 3); 
     Core.normalize(mTemp, imageMat, 0, 1., Core.NORM_MINMAX); 
     Imgproc.threshold(imageMat, mBin, .5, 1., Imgproc.THRESH_BINARY); 
     mBin.convertTo(dist_8u, CvType.CV_8U); 
     mTemp1 = dist_8u; 
     hierarchy = new Mat(); 
     Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
     no = contours.size();*/ 

    } 

    public void toBinary(Bitmap mGray) { 

     int width, height, threshold; 
     height = mGray.getHeight(); 
     width = mGray.getWidth(); 
     threshold = 32; 
     bmpBinary = Bitmap.createBitmap(mGray); 

     for(int x = 0; x < width; ++x) { 
      for(int y = 0; y < height; ++y) { 
       // get one pixel color 
       int pixel = mGray.getPixel(x, y); 
       int red = Color.red(pixel); 

       //get binary value 
       if(red < threshold){ 
        bmpBinary.setPixel(x, y, 0xFF000000); 
       } else{ 
        bmpBinary.setPixel(x, y, 0xFFFFFFFF); 
       } 

      } 
     } 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

,並在此線程,代碼也越來越問題

Thread [<12> Thread-8380] (Suspended (exception java.lang.NullPointerException))  
    <VM does not provide monitor information> 
    org.opencv.imgproc.Imgproc.threshold(org.opencv.core.Mat, org.opencv.core.Mat, double, double, int) line: 9172 
    com.example.lastdemo.MainActivity.onCameraFrame(org.opencv.android.CameraBridgeViewBase$CvCameraViewFrame) line: 105  
    org.opencv.android.JavaCameraView(org.opencv.android.CameraBridgeViewBase).deliverAndDrawFrame(org.opencv.android.CameraBridgeViewBase$CvCameraViewFrame) line: 387 
    org.opencv.android.JavaCameraView$CameraWorker.run() line: 328 
    java.lang.Thread.run() line: 856  
+0

你需要使用mTemp1 = dist_8u.clone()克隆dist_8u否則mTemp1只是指向同一位的數據。 – timegalore

+0

ohhh ya thanxx 我已經做到了,但仍然線程-12問題仍然是空白屏幕 – Div

+0

有幾件事情:在onCameraFrame檢查mRgba是否爲空,然後再繼續;它有時在啓動時似乎通過幾個空幀。如果它是空的只是返回。第二點是,你應該確定你的墊子是一些操作的目的地。一些操作不需要你這樣做,但其他操作。我傾向於確保首先確定它們的尺寸 - 我可以分享我如何做到這一點,如果它有用。你通常是通過將它建立在另一個你已經確定尺寸的Mat上來實現的,例如,mBin = new Mat(mGray.size(),mGray.type()) – timegalore

0

這一呼籲:

Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 

將修改dist_8u在在處理期間不合意的方式。我會使用的方法是在調用之前克隆dist_8u,然後將輪廓繪製到克隆上並返回克隆;調用後dist_8u不可用。

如果您只是想要輪廓,那麼您可以在具有相同尺寸和類型的dist_8u的空白圖像上繪製輪廓。

+0

thanxx答案 這是好的 – Div