猿问

如何在 Android Studio 中使用 OpenCV 检测和计数随机大小的白色物体

我正在尝试使用 OpenCV 在 Android Studio 中制作一个应用程序,该应用程序基本上查看一组点的图像并提取所有亮点,然后对它们进行计数。点的形状不一致,但点的颜色应该是白色背景黑色。

我首先上传这样的图像:

然后我获取图像的位图并将其转换为灰度。然后我检查灰度值是否在 aa 范围内并返回二进制值的位图。返回的图像如下所示:

http://img.mukewang.com/617a63f000017ef818521057.jpg

我已经失败尝试了几种不同的方法来计算这些点包括使用Imgproc.findContours和沿教程,例如以下这一个,但我不是在寻找一个特定的形状。它通常只是一次 1 到 50 个像素的分组,RGB 值分别为 225、255、255 和不规则形状。如何计算这些单独的形状?


这是我的代码的图像处理部分,countNonZero 部分只是让我知道有多少白色像素,对于这个特定的图像是 179


public void convertToGray(View v){

    int whitePix;

    Mat Rgba = new Mat();

    Mat grayMat = new Mat();

    Mat dots = new Mat();

    BitmapFactory.Options o = new BitmapFactory.Options();

    o.inDither=false;

    o.inSampleSize=4;


    int width = imageBitmap.getWidth();

    int height = imageBitmap.getHeight();


    grayBitmap = Bitmap.createBitmap(width,height,Bitmap.Config.RGB_565);



    //bitmap to MAT


    Utils.bitmapToMat(imageBitmap,Rgba);


    Imgproc.cvtColor(Rgba,Rgba,Imgproc.COLOR_RGB2GRAY);


    Core.inRange(Rgba,scalarLow,scalarHigh,grayMat);


    whitePix = Core.countNonZero(grayMat);


    Utils.matToBitmap(grayMat,grayBitmap);


     MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), grayBitmap, "Result", "Descrip");


    mImageView.setImageBitmap(grayBitmap);




}

在将图像上传到应用程序后单击按钮时会调用此函数。


繁花不似锦
浏览 223回答 2
2回答

拉丁的传说

我使用此代码迭代模板匹配结果 Mat 以查找可能的匹配项。public static List<Point> getPointsFromMatAboveThreshold(Mat m, float t){&nbsp; &nbsp; List<Point> matches = new ArrayList<Point>();&nbsp; &nbsp; FloatIndexer indexer = m.createIndexer();&nbsp; &nbsp; for (int y = 0; y < m.rows(); y++) {&nbsp; &nbsp; &nbsp; &nbsp; for (int x = 0; x < m.cols(); x++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (indexer.get(y,x)>t) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("(" + x + "," + y +") = "+ indexer.get(y,x));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matches.add(new Point(x, y));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; return matches;}这将为您提供一定数量的白色坐标列表。然后你需要将这些聚类

GCT1015

事实证明我错误地使用了 findContours,我能够通过在我的函数中附加以下代码来解决我的问题:&nbsp; &nbsp; Mat dots = new Mat();&nbsp; &nbsp; List<MatOfPoint> contours = new ArrayList<MatOfPoint>();&nbsp; &nbsp; Imgproc.findContours(grayMat, contours, dots, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));&nbsp; &nbsp; Imgproc.drawContours(grayMat, contours, -1, new Scalar(Math.random()*255, Math.random()*255, Math.random()*255));//, 2, 8, hierarchy, 0, new Point());countours 列表包含轮廓的整体数,这是我正在寻找的斑点数。
随时随地看视频慕课网APP

相关分类

Java
我要回答