SORU
9 AĞUSTOS 2013, Cuma


Bilgisayar Görme konveks ve sürekli kusur filtreleme OpenCV

Biliyorum bu soru olabilir biraz uzun ve zor ama lütfen acele etme bana yardım etmek, ya da en azından oy çok başka biri, kim bilir bu konuda iyi yapabilir çünkü soru görünür üst... (bu çok önemli benim için ve son bitirme gelecek hafta). Dilenci teşekkür ederiz.

Dijital Sinyal İşleme sorunu var. Parmak uçları, burada sunulan çözüm benzer algılamaya çalışıyorum: Hand and finger detection using JavaCV.

Ancak, biraz farklı olan JavaCV ama android için OpenCV kullanarak değilim. Tüm adımları öğretici sunulan yapmayı başardım, ama konveks ve sürekli kusur filtreleme. Bu benim resim gibi görünecektir:

Resolution 640x480

Burada başka bir çözünürlükte bir görüntü

Resolution 320x240

Açıkça gördüğünüz gibi, birçok kırmızı noktalar (deffects vertical) sarı nokta (konveks) için de Var. Bazen 2 sarı noktalar arasında oldukça garip olan hiç kırmızı nokta, (konveks nasıl hesaplanır?)

İhtiyacım olan şey bu link Daha önce sağlanan gibi benzer filtreleme işlevi oluşturmak için, ama OpenCV veri yapıları kullanarak.

Konveks tip MatOfİnt ... Sürekli kusurları MatOfİnt4 ... türü vardır

Aptal OpenCV veri aynı veri içeren farklı türde kullanır, çünkü bazı ek veri yapıları da farklı yöntemleri I yarattı

convexHullMatOfInt = new MatOfInt();
convexHullPointArrayList = new ArrayList<Point>();
convexHullMatOfPoint = new MatOfPoint();
convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();

Şimdiye kadar yaptım ama iyi çalışmıyor. Sorun muhtemelen yanlış bir şekilde veri dönüştürme:

Konveks ve sürekli kusur oluşturma:

public void calculateConvexHulls()
{
    convexHullMatOfInt = new MatOfInt();
    convexHullPointArrayList = new ArrayList<Point>();
    convexHullMatOfPoint = new MatOfPoint();
    convexHullMatOfPointArrayList = new ArrayList<MatOfPoint>();

    try {
        //Calculate convex hulls
        if(aproximatedContours.size() > 0)
        {
            Imgproc.convexHull( aproximatedContours.get(0), convexHullMatOfInt, false);

            for(int j=0; j < convexHullMatOfInt.toList().size(); j  )
                convexHullPointArrayList.add(aproximatedContours.get(0).toList().get(convexHullMatOfInt.toList().get(j)));
            convexHullMatOfPoint.fromList(convexHullPointArrayList);
            convexHullMatOfPointArrayList.add(convexHullMatOfPoint);    
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.e("Calculate convex hulls failed.", "Details below");
        e.printStackTrace();
    }
}

public void calculateConvexityDefects()
{
    mConvexityDefectsMatOfInt4 = new MatOfInt4();

    try {
        Imgproc.convexityDefects(aproximatedContours.get(0), convexHullMatOfInt, mConvexityDefectsMatOfInt4);

        if(!mConvexityDefectsMatOfInt4.empty())
        {
            mConvexityDefectsIntArrayList = new int[mConvexityDefectsMatOfInt4.toArray().length];
            mConvexityDefectsIntArrayList = mConvexityDefectsMatOfInt4.toArray();
        }
    } catch (Exception e) {
        Log.e("Calculate convex hulls failed.", "Details below");
        e.printStackTrace();
    }
}

Filtreleme:

public void filterCalculatedPoints()
    {
        ArrayList<Point> tipPts = new ArrayList<Point>();
        ArrayList<Point> foldPts = new ArrayList<Point>();
        ArrayList<Integer> depths = new ArrayList<Integer>();

        fingerTips = new ArrayList<Point>();

        for (int i = 0; i < mConvexityDefectsIntArrayList.length/4; i  )
        {
            tipPts.add(contours.get(0).toList().get(mConvexityDefectsIntArrayList[4*i]));
            tipPts.add(contours.get(0).toList().get(mConvexityDefectsIntArrayList[4*i 1]));
            foldPts.add(contours.get(0).toList().get(mConvexityDefectsIntArrayList[4*i 2]));
            depths.add(mConvexityDefectsIntArrayList[4*i 3]);
        }

        int numPoints = foldPts.size();
        for (int i=0; i < numPoints; i  ) {
            if ((depths.get(i).intValue()) < MIN_FINGER_DEPTH)
                continue;

            // look at fold points on either side of a tip
            int pdx = (i == 0) ? (numPoints-1) : (i - 1);
            int sdx = (i == numPoints-1) ? 0 : (i   1);

            int angle = angleBetween(tipPts.get(i), foldPts.get(pdx), foldPts.get(sdx));
            if (angle >= MAX_FINGER_ANGLE)   // angle between finger and folds too wide
                continue; 

            // this point is probably a fingertip, so add to list
            fingerTips.add(tipPts.get(i));
        }
    }

Sonuçlar (beyaz noktalar filtreleme sonra parmak):

enter image description here

Beni süzmek için uygun bir fonksiyon yazmak için yardım eder misiniz?

GÜNCELLEME 14.08.2013

Kontur uyumu için standart openCV fonksiyonu kullanıyorum. Değişim çözünürlük, ve el kamerası oldukça zor olan mesafe, yaklaşık değeri değiştirmek için ne yapmam gerektiğini. Eğer çözünürlüğü daha küçük ise, o zaman parmak daha az piksel oluşur, böylece yaklaşık değeri sevgilisi olmalı. Mesafe ile aynı. Bunu yüksek tutmak tamamen parmak kaybetmenize neden olur. Yaklaşım bu sorunu çözmek için iyi bir yaklaşım değil bence, ancak küçük değer hesaplamaları hızlandırmak için yararlı olabilir:

Imgproc.approxPolyDP(frame, frame, 2 , true); 

Eğer yüksek değerler kullanırsam, o zaman neden mesafe ve çözünürlüğünü değiştirmek olmaz eğer sadece iyi olan görüntü aşağıdaki gibidir.Ayrıca, tekneleri için varsayılan yöntem ve kusurları noktaları geçirmek için yararlı argüman yok (min açı, mesafe vb.) işaret eden oldukça şaşırdım...

Görüntüsünün altında her zaman bağımsız bir çözüm elde etmek istediğim etkiyi hediye veya el kamerası mesafe. Ayrıca benim palm kapattığımda herhangi bir sarı noktalar görmek istemiyorum...

Her şeyi özetlemek gerekirse, bilmek istiyorum:

  • nasıl puan süzmek için
  • nasıl her zaman işe hangi çözünürlük ve mesafe bağımsız bir yaklaşım yapabilirim
  • bilen birileri ya da bazı malzemeler (grafiksel gösterim, açıklama) bu veri yapıları OpenCV ile ilgili ise, onu okumak çok mutlu olurum. (Mat,,, MatOfPoint2, MatOfPoint4 vb MatOfPoint MatOfİnt.)

enter image description here

CEVAP
12 EKİM 2013, CUMARTESİ


Düşük çözünürlüklü dışbükey gövde bir bütün olarak ele konumunu tanımlamak için kullanılabilir, parmaklar için yararlı değildir ama ilgi çekici bir bölge ve uygun bir ölçek sağlar.

Yüksek çözünürlüklü analiz etmeli sonra uygulanması için yaklaşık dağılımı, kolay atlamak için herhangi bir işaret yok pass "uzunluk ve açı" kriterlerin son iki ama olabilir dilemek "ortalama" yerine "skip tamamen".

Sizin kod örneği tek bir pas hesaplama faiz oranını kusurları ve sonra kaldırarak onları .. bu bir mantık hatası .. ihtiyacın kaldırmak noktaları olarak git .. (a) daha hızlı ve daha kolay her şeyi yapmak için bir one-pass (b) önler çıkarma noktasında bir ilk geçiş ve eklemek onları daha sonra geri çünkü herhangi bir temizleme değişiklikler önceki calcs.

Bu temel tekniği çok basit ve çok temel bir açık palmiye için çalışıyor. Yani ölçek, açı ve uzunluk parametreleri ayarlama hiç alacak sadece ama özünde bir el ya da bir jest anlamıyor "şimdiye kadar".

Teknikleri başvurular: filtre uzunluğu ve açısı "Sürekli kusur" Simen Andresen http://simena86.github.io/blog/2013/08/12/hand-tracking-and-recognition-with-opencv/ blog

Temel C Kinect SDK# Kitaplığına ekledi parmak yönde algılama http://candescentnui.codeplex.com/ http://blog.candescent.ch/2011/11/improving-finger-detection.html

"Kendi kendine büyüyen ve organize sinir gazı" (SGONG) Prof Nikos http://www.papamarkos.gr/uploaded-files/Hand gesture recognition using a neural network shape fitting technique.pdf Papamarkos

Ticari ürün David Holz & Michael Buckwald kurucularından "Leap Motion" http://www.engadget.com/2013/03/11/leap-motion-michael-buckwald-interview/

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Best Quality Cartoons

    Best Quality

    10 ŞUBAT 2014
  • Engadget

    Engadget

    18 EYLÜL 2006
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011