【问题标题】:unable to copy cropped image (opencv Mat) into Bitmap无法将裁剪的图像(opencv Mat)复制到位图中
【发布时间】:2017-05-12 14:49:38
【问题描述】:

我有一个输入图像 sourceMat。

在 (10,10) 处裁剪 40x40 的 roi:

Mat roi = sourceMat.submat(10, 50, 10, 50);

创建大小为 40x40 的位图:

Bitmap tempBitmap = Bitmap.createBitmap(40, 40, thumbnail.getConfig());

将 Mat 转换为 Bitmap 并在 ImageView 中设置:

Utils.matToBitmap(roi, tempBitmap);
imageView.setImageBitmap(tempBitmap );

它不显示裁剪后的图像,而是将整个原始图像缩小为 40x40 位图。

我正在使用 openCVLibrary320 和 android sdk 版本 25

【问题讨论】:

  • 需要从 ImageMat 即 sourceMat 中裁剪一部分并将其显示在 imageView 上。
  • 感谢您的回复@Antonio 并致力于 openCVLibrary320 和 android sdk 版本 25。
  • 我也想试试Bitmap.createBitmap(40, 40, RGB_565); 顺便问一下thumbnail 是什么?
  • 您应该尝试使用Bitmap.Config.ARGB_8888 而不是thumbnail.GetConfig()
  • 谢谢大家...它可以工作,代码是正确的小改动...@RickM.@Antonio.

标签: android opencv


【解决方案1】:

替换:

Bitmap tempBitmap = Bitmap.createBitmap(40, 40, thumbnail.getConfig());

使用以下任何一种:

Bitmap.createBitmap(40, 40, Bitmap.Config.RGB_565);
Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888);

documentation

【讨论】:

    【解决方案2】:

    代码运行良好,代码会有小的变化。

      private void showDialog(File pictureFile) {
        // custom dialog
        final Dialog dialog = new Dialog(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
        dialog.setContentView(R.layout.image_dialog);
        dialog.setTitle("Image");
        // find the imageview and draw it!
        ImageView image = (ImageView) dialog.findViewById(R.id.image);
        Bitmap thumbnail;
        try {
            thumbnail = MediaStore.Images.Media.getBitmap(
                    getContentResolver(), Uri.fromFile(pictureFile));
            cropImage(image, thumbnail);
    //            Imgproc.threshold(tmp, tmp, 60, 100, Imgproc.THRESH_BINARY);
    //            Utils.matToBitmap(tmp, image1);
    //            Imgproc.threshold(tmp, tmp, 1, 255, Imgproc.THRESH_OTSU);
            //using floodfill and watershed to remove noise
    //            Mat mask = new Mat(tmp.rows() + 2, tmp.cols() + 2, CvType.CV_8UC1);
    //            Imgproc.floodFill(tmp, mask, new Point(tmp.cols() - 10, 10), new Scalar(255.0, 255.0, 255));
            image.setImageBitmap(thumbnail);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK);
        // if button is clicked, close the custom dialog
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }
    
    private void cropImage(ImageView image, Bitmap thumbnail) {
        Mat src = new Mat();
        Utils.bitmapToMat(thumbnail, src);
        //converts mat color
        Imgproc.cvtColor(src, src, Imgproc.COLOR_RGBA2BGR);
        Rect roi = new Rect(40, 100, 100, 120);
        Mat cropped = new Mat(src, roi);
        Bitmap tempBmp1 = Bitmap.createBitmap(100, 120, Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(cropped, tempBmp1);
        image.setImageBitmap(tempBmp1);
    }
    

    【讨论】:

    • 你能开发这个吗?从不工作到开始工作的那一刻,一定发生了一些变化。这个答案/问题不会像那样帮助任何人!
    猜你喜欢
    • 2012-01-22
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多