How to detect(Count) Hair inside rectangle Hair images?

asked 2016-10-10 07:25:38 -0600

Umar gravatar image

updated 2016-10-10 07:53:27 -0600

I have write one code to detect hairs from head and get count. But not able to get exact result as per the image exist

image description image description

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;

}

edit retag flag offensive close merge delete

Comments

1

i have no solution, but houghlines can only detect absolutely straight lines.

berak gravatar imageberak ( 2016-10-10 07:37:16 -0600 )edit

@berak can you please give some reference link

Umar gravatar imageUmar ( 2016-10-10 07:38:58 -0600 )edit

also, please try without the Canny, hough works on gradients, and Canny removes those (replaces then with edges)

berak gravatar imageberak ( 2016-10-10 07:45:03 -0600 )edit

@berak let me try with your suggetions

Umar gravatar imageUmar ( 2016-10-10 07:50:30 -0600 )edit

@berak nothing happened to change

Umar gravatar imageUmar ( 2016-10-11 00:07:33 -0600 )edit