【问题标题】:Transforming an image to black and white (not grayscale)将图像转换为黑白(非灰度)
【发布时间】:2015-11-25 21:12:43
【问题描述】:

有没有办法在 Xamarin.Forms 或 Xamarin.Android 中对图像进行阈值处理?

我想对在 android 中用相机拍摄的每张照片进行阈值处理(一次一张),目前我正在使用 xlabs 进行相机捕捉。

我已经搜索过,但没有发现任何有用的信息。也许你们可以帮助我。 :)

【问题讨论】:

  • @willaien 感谢您提供的信息。但理想情况下,我想要一张只有黑白的图像,而不是灰度图像。这使文本更清晰,更易于在 OCR 上使用。
  • 你可以做到。我会告诉你怎么做。

标签: c# image-processing xamarin xamarin.android xamarin.forms


【解决方案1】:

为此,您可以使用OpenCV Library for Android。

  1. 下载from here(例如)version 3.0.0
  2. 现在您需要将Android Java Binding Library 添加到您的Xamarin.Android 项目中(您也可以阅读此great article)
  3. 当 Android Java Binding Library 被添加到您的项目时,您需要添加从 OpenCV SDK 通过 @ 生成的 .jar 987654325@(但我已经为你做了这个,这里是生成的 .jar 的link)。
  4. 在您的 Android Java 绑定库 -> 文件夹(Jars)中添加现有文件(来自步骤 3 的.jar),也您需要将共享对象添加到 Jar 文件夹(来自 YourPathWhereIsStoreSDK/OpenCV-android-sdk/sdk/native/libs/armeabi...等)。
    结果必须与此类似:
  5. 现在,在您的 Xamarin.Android 项目中,您必须引用 Android Java 绑定库 项目。
  6. 参见下面的代码,如何使用这个库:)。

在您的启动活动(或 MainActivity)中添加:

   //beware,that we need to INIT Only once,so better to put in SplashActivity
    public  MainActivity()
            {
                if (!OpenCVLoader.InitDebug())
                {
                    System.Console.WriteLine("Failed to INIT \n OpenCV Failure");
                }
                else
                {
                    System.Console.WriteLine("OpenCV INIT Succes");
                }

            }  

现在我们可以将图像转换为黑白:

void ConvertImageToBW()
    {
        Mat MatToBW = new Mat();
        using (Bitmap SourceImg = Bitmap.CreateBitmap(BitmapFactory.DecodeFile(App._file.Path)))  //App._file.Path  - path of image that we have made by camera 
        {
            if (SourceImg != null)
            {
                Utils.BitmapToMat(SourceImg,MatToBW);
                //first we convert to grayscale
                Imgproc.CvtColor(MatToBW, MatToBW, Imgproc.ColorRgb2gray);
                //now converting to b/w
                Imgproc.Threshold(MatToBW, MatToBW, 0.5 * 255, 255, Imgproc.ThreshBinary);
                using(Bitmap newBitmap = Bitmap.CreateBitmap(MatToBW.Cols(),MatToBW.Rows(),Bitmap.Config.Argb8888))
                {
                    Utils.MatToBitmap(MatToBW, newBitmap);
                    //put result in your imageView, B/W Image
                    imageView.SetImageBitmap(newBitmap);
                }
            }

        }
    }

现在只需将此方法用于您的 OnActivityResult。
享受吧!

【讨论】:

  • 这就像一个魅力,非常感谢。不过我有一个问题,OpenCV 不想初始化,我在 Android Java 绑定库选项中将目标框架更改为 Android 4.4 (Kit Kat) 并且它有效。 :D
猜你喜欢
  • 2013-04-21
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多