如何使用OpenCV和Android Studio检测内部存储中文件夹中图像的颜色?

问题描述 投票:0回答:1

我对Android Studio不太了解,我必须检测图像的颜色。我正在使用OpenCV,但是我发现有一些代码可以执行此操作,但是它只能检测内部存储根目录中图像的颜色,而我想使用的是位于“ Pictures”文件夹中的图像。] >

这是执行此操作的代码部分:

Mat img = imread(Environment.getExternalStorageDirectory().getAbsolutePath() + "im.jpg");

Mat oImg = detectColor(img);

我尝试添加图像的完整路径,但是当我这样做时,该应用程序无法正常工作:

Mat img = imread(Environment.getExternalStorageDirectory().getAbsolutePath() + "/storage/emulated/0/Pictures/im.jpg");

Mat oImg = detectColor(img);

这就是MainActivity.java,我还没有添加拍摄和保存图片的部分。

公共类MainActivity扩展了AppCompatActivity {

private final static int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1;
private static String[] PERMISOS = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private Toast toast;

private static final String TAG = "MainActivity" ;
ImageView imgView;
Button processBtn;
TextView txtResult;

// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}

private BaseLoaderCallback _baseLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i(TAG, "OpenCV loaded successfully");

            }
            break;
            default: {
                super.onManagerConnected(status);
            }
        }
    }
};

//to check whether opencv is loaded successfully or not.
static {
    if (OpenCVLoader.initDebug()){
        Log.d(TAG,"OpenCV loaded successfully");
    }else {
        Log.d(TAG,"OpenCV not loaded");

    }
}

@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    permisos();
    processBtn = (Button) findViewById(R.id.processImgBtn);
    imgView = (ImageView) findViewById(R.id.img);


    processBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            processImage();
        }
    });
}



private void processImage(){

    //reading input image from internal storage.
    /*Se lee la imagen que quieres, pero desde el almacenamiento interno de tu celular, debes poner la imagen
    "colores.jpg" en el directorio raíz del almacenamiento interno de tu celular, en este caso estará leyendo
     todo el tiempo "colores.jpg" y hará lo que OPENCV quiera hacer con la imagen */
    Mat img = imread(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ storage / emulated / 0 / Pictures / im.jpg");
    Mat oImg = detectColor(img);

    // converting image from Mat to bitmap to display in ImageView:
    Bitmap bm = Bitmap.createBitmap(oImg.cols(), oImg.rows(),Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(oImg,bm);
    imgView.setImageBitmap(bm);
}


Mat detectColor(Mat srcImg) {
    Mat blurImg = new Mat();
    Mat hsvImage = new Mat();
    Mat color_range_red = new Mat();
    Mat color_range_green = new Mat();
    Mat color_range = new Mat();

    //bluring image to filter small noises.
    Imgproc.GaussianBlur(srcImg, blurImg, new Size(5,5),0);

    //converting blured image from BGR to HSV
    Imgproc.cvtColor(blurImg, hsvImage, Imgproc.COLOR_BGR2HSV);

    //filtering red and green pixels based on given opencv HSV color range
    Core.inRange(hsvImage, new Scalar(0,50,50), new Scalar(5,255,255), color_range_red);
    Core.inRange(hsvImage, new Scalar(40,50,50), new Scalar(50,255,255), color_range_green);

    //applying bitwise or to detect both red and green color.
    Core.bitwise_or(color_range_red,color_range_green,color_range);

    return color_range;


}


@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
    String mensaje = "";
    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        mensaje = "Permiso Concedido";
    }else{
        mensaje = "Permiso no concedido";
    }
    toast = Toast.makeText(this, mensaje, Toast.LENGTH_LONG);
    toast.show();
}
private void permisos(){
    int permissionCheck = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if(permissionCheck!= PackageManager.PERMISSION_GRANTED){ //No tiene el permiso
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        } else {
            ActivityCompat.requestPermissions(this,
                    PERMISOS,
                    MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
        }
    }
}





@Override
public void onResume() {
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        //try to load again
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, _baseLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        _baseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

}

我对Android Studio不太了解,我必须检测图像的颜色。我正在使用OpenCV,但发现有一些代码可以执行此操作,但是它只能检测到...

android opencv
1个回答
0
投票

您可以在下一部分拍摄的照片的右侧文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.