为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2021-10-28 16:47:59
我正在尝试使用 OpenCV 在 Android Studio 中制作一个应用程序,该应用程序基本上查看一组点的图像并提取所有亮点,然后对它们进行计数。点的形状不一致,但点的颜色应该是白色背景黑色。我首先上传这样的图像:然后我获取图像的位图并将其转换为灰度。然后我检查灰度值是否在 aa 范围内并返回二进制值的位图。返回的图像如下所示:我已经失败尝试了几种不同的方法来计算这些点包括使用Imgproc.findContours和沿教程,例如以下这一个,但我不是在寻找一个特定的形状。它通常只是一次 1 到 50 个像素的分组,RGB 值分别为 225、255、255 和不规则形状。如何计算这些单独的形状?这是我的代码的图像处理部分,countNonZero 部分只是让我知道有多少白色像素,对于这个特定的图像是 179public 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);}在将图像上传到应用程序后单击按钮时会调用此函数。
查看完整描述

2 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我使用此代码迭代模板匹配结果 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;

}

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


查看完整回答
反对 回复 2021-10-28
?
GCT1015

TA贡献1827条经验 获得超4个赞

事实证明我错误地使用了 findContours,我能够通过在我的函数中附加以下代码来解决我的问题:


    Mat dots = new Mat();

    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

    Imgproc.findContours(grayMat, contours, dots, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));


    Imgproc.drawContours(grayMat, contours, -1, new Scalar(Math.random()*255, Math.random()*255, Math.random()*255));//, 2, 8, hierarchy, 0, new Point());

countours 列表包含轮廓的整体数,这是我正在寻找的斑点数。


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信