【问题标题】:How to detect (Count) Hair from image using OpenCV?如何使用 OpenCV 从图像中检测(计数)头发?
【发布时间】:2016-10-11 10:50:07
【问题描述】:

我使用OpenCV 函数cvtColorCannyHoughLinesP 尝试了下面的代码,但在某些情况下无法获得准确的结果或不起作用。

private boolean opencvProcessCount(Uri picFileUri) {
hairCount = 0;
totalC = 0;
//Log.e(">>>>>>>>","count " + picFileUri);
try {
    InputStream iStream = getContentResolver().openInputStream(picFileUri);
    byte[] im = getBytes(iStream);
    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inDither = true;
    opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
    Bitmap image = BitmapFactory.decodeByteArray(im, 0, im.length);

    Mat mYuv = new Mat();
    Utils.bitmapToMat(image, mYuv);
    Mat mRgba = new Mat();
    Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_RGB2GRAY, 4);
    Imgproc.Canny(mRgba, mRgba, 80, 90);
    Mat lines = new Mat();
    int threshold = 80;
    int minLineSize = 30;
    int lineGap = 100;

    Imgproc.HoughLinesP(mRgba, lines, 1, Math.PI/180, threshold, minLineSize, lineGap);

    for (int x = 0; x < lines.rows(); x++)
    {
        double[] vec = lines.get(x, 0);
        double x1 = vec[0],
                y1 = vec[1],
                x2 = vec[2],
                y2 = vec[3];
        Point start = new Point(x1, y1);
        Point end = new Point(x2, y2);
        double dx = x1 - x2;
        double dy = y1 - y2;

        double dist = Math.sqrt (dx*dx + dy*dy);
        totalC ++;
        Log.e(">>>>>>>>","dist " + dist);
        if(dist>300.d)
        {
            hairCount ++;
            // Log.e(">>>>>>>>","count " + x);
            Imgproc.line(mRgba, start, end, new Scalar(0,255, 0, 255),5);// here initimg is the original image.
        }// show those lines that have length greater than 300


    }

    Log.e(">>>>>>>>",totalC+" out hairCount " + hairCount);

    // Imgproc.
} catch (Throwable e) {
    // Log.e(">>>>>>>>","count " + e.getMessage());
    e.printStackTrace();
}
return false;
}

以下是用于计算头发的示例图像:

【问题讨论】:

  • 嗨,你能提供一个简约的代码吗? (没有 Bitmap,没有全局成员变量等)这将有助于其他人更多地关注问题。
  • 也许还有一些来自您的预处理步骤的图像,比如 canny 以及找到的霍夫线?
  • @saurabheights,在这里我添加了实际代码,所以如果我这样做了,任何人都可以识别我的问题或错误的实现。
  • @HareshChhelana:这是我的想法: 1. 保存 Canny 输出。 2. 暂时限制只有黑色的头发(没有黑发,没有金发)。 3. 在运行 Hough 之前优化 Canny 输出以去除异常值。 4. 未进行预处理:使用色相/饱和度去除反射并从头发上分离皮肤。 5.去掉第二张测试图,遮挡只会增加canny之后如何处理的复杂度。相反,使用类似于第一张测试图片的更大的图像数据集。 6.一旦霍夫变换给出了足够的线条,使用更智能的逻辑来找出哪些线条形成头发。
  • @saurabheights,如果可以的话,你能分享一些代码吗?

标签: android opencv opencv4android opencv3.1


【解决方案1】:

我想你会觉得这篇文章很有趣:

http://www.cs.ubc.ca/~lowe/papers/aij87.pdf

他们采用 2D 位图,应用精明的边缘检测器,然后根据它们属于同一对象的可能性重新组合不同边缘的片段 - 在这种情况下是头发(并给出这种重新组合的标准)。

我认为您可以使用它来了解图像上有多少物体,如果图像仅包含头发,那么您将计算头发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 2021-08-30
    • 2018-07-18
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多