Android Opencv Submat null对象引用

时间:2016-09-20 01:35:15

标签: android opencv image-processing

我正在尝试使用android opencv中的颜色blob检测算法检测静态图像的颜色。

我在submat()区域有问题,但我已经正确安装了opencv。得到此错误: PS:mRgba被声明为Mat

 java.lang.NullPointerException: Attempt to invoke virtual method 'org.opencv.core.Mat org.opencv.core.Mat.submat(org.opencv.core.Rect)' on a null object reference
                                                                                      at com.example.backup.contour_image.MainActivity.onTouch(MainActivity.java:103)
                                                                                      at android.view.View.dispatchTouchEvent(View.java:9406)
                                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
                                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2257)
                                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
                                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2257)
                                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
                                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2257)
                                                                                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2668)
                                                                                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2257)

我的代码

 public boolean onTouch(View v, MotionEvent event)
{
    //mDetector = new ColorBlobDetector();
    Bitmap bm =((BitmapDrawable)iv.getDrawable()).getBitmap();
    Mat touchedRegionHsv = new Mat();
    Log.e(TAG,"Touched!");
    Utils.bitmapToMat(bm,touchedRegionHsv,true);

    Scalar lower = new Scalar(22,255,255);
    Scalar upper = new Scalar(38,100,100);

    Rect roi = new Rect();

    int x = (int)event.getX();
    int y = (int)event.getY();

    roi.x = (x>4) ? x-4 : 0;                         
    roi.y = (y>4) ? y-4 : 0;

    roi.width = 8;
    roi.height = 8;

    Mat touchedRegionRgba = mRgba.submat(roi);    //<--------------- line of error
    Mat touchedRegionRgba_clone = touchedRegionRgba.clone();

    Imgproc.cvtColor(touchedRegionRgba,touchedRegionHsv,Imgproc.COLOR_RGB2HSV);
    Core.inRange(touchedRegionHsv,lower,upper,touchedRegionRgba_clone);

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Mat heirarchy = new Mat();
    Imgproc.findContours(touchedRegionRgba_clone,contours,heirarchy,Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_NONE);

    return false;
}

1 个答案:

答案 0 :(得分:0)

您需要在mRgba之前检查nullmRgba.submit()