2016-10-11 18 views
5

Tôi đã thử mã bên dưới bằng cách sử dụng các chức năng OpenCVcvtColor, CannyHoughLinesP nhưng không thể nhận được kết quả chính xác hoặc không hoạt động trong một số trường hợp.Làm thế nào để phát hiện (Đếm) Tóc từ hình ảnh sử dụng OpenCV?

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; 
} 

Dưới đây là hình ảnh mẫu để đếm tóc:

enter image description here

enter image description here

+0

Xin chào, bạn có thể cung cấp mã tối giản không? (Không có Bitmap, không có biến thành viên toàn cục, v.v.) Điều này sẽ giúp người khác tập trung hơn vào vấn đề. – saurabheights

+1

và có thể một số hình ảnh từ các bước tiền xử lý của bạn, chẳng hạn như canny và cả các đường hough tìm thấy? – PSchn

+0

@ saurabheights, Ở đây tôi đã thêm mã thực tế để mọi người có thể xác định được vấn đề của tôi hoặc triển khai sai nếu tôi đã làm. –

Trả lời

0

Tôi nghĩ rằng bạn sẽ tìm thấy bài viết này thú vị:

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

Các y lấy một bitmap 2D, áp dụng dò cạnh canny và sau đó tập hợp lại các phân đoạn của các cạnh khác nhau dựa trên khả năng chúng thuộc về cùng một đối tượng - trong trường hợp này tóc (và đưa ra các tiêu chuẩn cho việc nhóm lại).

Tôi nghĩ bạn có thể sử dụng điều này để biết có bao nhiêu đối tượng có trên hình ảnh và nếu hình ảnh chỉ chứa tóc, thì bạn sẽ có số lượng tóc.

Các vấn đề liên quan