Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Intent返回的Uri创建Mat对象_Java_Android_Opencv_Android Intent - Fatal编程技术网

Java 从Intent返回的Uri创建Mat对象

Java 从Intent返回的Uri创建Mat对象,java,android,opencv,android-intent,Java,Android,Opencv,Android Intent,我是Android编程的初学者。我有一个使用OpenCV处理Java编写的图像的代码。 我在考虑重用代码。为此,我必须选择一个图像并为其创建Mat对象 我设置了一个OnClick事件监听器并调用了一个函数,该函数反过来使用Intent来选择一个图像。函数调用如下所示 selectImage.setOnClickListener( new Button.OnClickListener() { public void onClick(View v){

我是Android编程的初学者。我有一个使用OpenCV处理Java编写的图像的代码。 我在考虑重用代码。为此,我必须选择一个图像并为其创建
Mat
对象

我设置了一个OnClick事件监听器并调用了一个函数,该函数反过来使用Intent来选择一个图像。函数调用如下所示

selectImage.setOnClickListener(
        new Button.OnClickListener() {
                public void onClick(View v){
                    selectImageFromGallery();
                }
        }
);
@Override
protected void onActivityResult(int requestCode , int resultCode , Intent data){
        if(resultCode == RESULT_OK){
            Uri imageUri;
            if(data == null || data.getData()== null){
                imageUri = uriPhoto;
//                Log.i("URI","HERE");
            }else{
                imageUri = data.getData();

                Log.i("URI",imageUri.toString());

// I'm GETTING URI OF THE SELECTED IMAGE,BEING LOGGED SUCCESSFULLY !

                Imgcodecs imageCodecs = new Imgcodecs();
                Mat obj = imageCodecs.imread(imageUri.getPath());
                Log.i("URI" , "MAT OBJECT CREATED SUCCESSFULLY");
                Log.i("URI" , new Integer((int) obj.size().height).toString());
                Log.i("URI" , new Integer((int) obj.size().width).toString());
            }
            Intent intent = new Intent();
            intent.setData(imageUri);
            setResult(RESULT_OK , intent);
            finish();
        }
 }
selectImageFromGallery()的代码如下:

private void selectImageFromGallery(){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/png");
        if(intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent , SELCT_IMAGE_CODE);
        }
 }
我正在处理Intent返回的结果,如下所示

selectImage.setOnClickListener(
        new Button.OnClickListener() {
                public void onClick(View v){
                    selectImageFromGallery();
                }
        }
);
@Override
protected void onActivityResult(int requestCode , int resultCode , Intent data){
        if(resultCode == RESULT_OK){
            Uri imageUri;
            if(data == null || data.getData()== null){
                imageUri = uriPhoto;
//                Log.i("URI","HERE");
            }else{
                imageUri = data.getData();

                Log.i("URI",imageUri.toString());

// I'm GETTING URI OF THE SELECTED IMAGE,BEING LOGGED SUCCESSFULLY !

                Imgcodecs imageCodecs = new Imgcodecs();
                Mat obj = imageCodecs.imread(imageUri.getPath());
                Log.i("URI" , "MAT OBJECT CREATED SUCCESSFULLY");
                Log.i("URI" , new Integer((int) obj.size().height).toString());
                Log.i("URI" , new Integer((int) obj.size().width).toString());
            }
            Intent intent = new Intent();
            intent.setData(imageUri);
            setResult(RESULT_OK , intent);
            finish();
        }
 }
但是,在LogCat中,当我记录
Mat
对象的高度和宽度时,我得到的图像大小为0(所选图像的大小为2160 x 1080)

相应的LogCat信息为

2019-02-06 23:48:21.927 27321-27321/com.example.hari.imagesteganography I/URI: content://com.android.providers.media.documents/document/image%3A110235
2019-02-06 23:48:21.938 27321-27321/com.example.hari.imagesteganography I/URI: MAT OBJECT CREATED SUCCESSFULLY
2019-02-06 23:48:21.940 27321-27321/com.example.hari.imagesteganography I/URI: 0
2019-02-06 23:48:21.940 27321-27321/com.example.hari.imagesteganography I/URI: 0

我已经在我的项目中成功地配置了
OpenCV
,并通过
System.loadLibrary(“OpenCV\u java3”)

这是从用户选择的图像创建
Mat
对象的正确方法吗

如果没有,在这种情况下如何创建
Mat
对象


谢谢。

我总是使用位图转换。CvType.CV_8UC4适用于ARGB/RGB(Bitmap.Config.ARGB_8888)

import org.opencv.android.Utils

    @Override
    protected void onActivityResult(int requestCode , int resultCode , Intent data){
        if(resultCode == RESULT_OK){
            Uri imageUri;
            if(data == null || data.getData()== null){
                imageUri = uriPhoto;
//                Log.i("URI","HERE");
            }else{
                imageUri = data.getData();
            Log.i("URI",imageUri.toString());

            BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
            bmpFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;

            Uri imageUri = data.getData();
            Bitmap bmp = MediaStore.Images.Media.getBitmap(
                                                  this.getContentResolver(),
                                                  imageUri);

            Mat obj = new Mat(bmp.width, bmp.height, CvType.CV_8UC4)
            Utils.bitmapToMat(bmp, obj)
            Log.i("URI" , "MAT OBJECT CREATED SUCCESSFULLY");
            Log.i("URI" , String.valueOf(obj.cols()));
            Log.i("URI" , String.valueOf(obj.rows()));
        }
        Intent intent = new Intent();
        intent.setData(imageUri);
        setResult(RESULT_OK , intent);
        finish();
    }

}

请参见:谢谢您的回答,但是,如何获取
CV\u 8UC3
图像?我刚刚调整并编写了
Mat obj=new Mat(bmp.width,bmp.height,CvType.CV_8UC3)
。但仍然
obj.type()
返回24,表示
CV_8UC4
。我还尝试了
cvtColor(obj,this.coverImage,Imgproc.COLOR\u BGRA2BGR)
。但是,它不起作用!正如我所知,您需要手动设置它,但是如果您将使用需要的函数,例如,像Imgproc.adaptiveThreshold(…),那么您可能会看到崩溃/异常。换句话说,8位灰度图像可以存储在CV_8UC4中,但RGB不能存储在CV_8UC1中。我只是在内存没有很强的限制时使用CV_8UC4,因为它不会影响执行时间。