java - 从 Intent 返回的 Uri 创建 Mat 对象

标签 java android opencv android-intent

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

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

selectImage.setOnClickListener(
        new Button.OnClickListener() {
                public void onClick(View v){
                    selectImageFromGallery();
                }
        }
);

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返回的结果,如下。

@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_java3")正确加载了它

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

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

谢谢。

最佳答案

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

导入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();
    }

}

关于java - 从 Intent 返回的 Uri 创建 Mat 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54560346/

相关文章:

java - 使用 Feign 发布表单

java - android 图像裁剪器无法正常工作

java - 如何使用 Kotlin 扩展 Java 类以像 static fun 一样使用?

android - 音频-Android

java - 着色器android错误: "Invalid version shader"

python - cv2.kmeans 参数错误-python

object - OpenCV - 在 OpenCV 中训练 LatentSVMDetector 模型(Pedro Felzenszwalb 的算法)

python - AttributeError: 'tuple' 对象没有属性 'sort'

java - java中输出字数统计时出错

java - Android - RecyclerView 数据未显示