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

我首先上传这样的图像:
java - 如何在Android Studio中使用OpenCV检测和计数随机大小的白色物体-LMLPHP

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

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

我尝试了几种不同的方法来计算这些点,包括使用Imgproc.findContours以及遵循诸如this one之类的教程,但均未成功,但我没有寻找特定的形状。一次最多只能是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);



}

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

最佳答案

我使用此代码遍历模板匹配结果Mat以查找可能的匹配。

public static List<Point> getPointsFromMatAboveThreshold(Mat m, float t){
    List<Point> matches = new ArrayList<Point>();
    FloatIndexer indexer = m.createIndexer();
    for (int y = 0; y < m.rows(); y++) {
        for (int x = 0; x < m.cols(); x++) {
            if (indexer.get(y,x)>t) {
                System.out.println("(" + x + "," + y +") = "+ indexer.get(y,x));
                matches.add(new Point(x, y));
            }
        }
    }
    return matches;
}

这将为您提供一定数量白色的坐标列表。然后,您需要将那些

关于java - 如何在Android Studio中使用OpenCV检测和计数随机大小的白色物体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52673170/

10-14 10:03