2011-06-28 9 views
6

Próbuję wprowadzić przepływ optyczny w Androidzie przy użyciu openCV http://code.google.com/p/android-opencv/. Zasadniczo chcę zbudować coś takiego: http://www.youtube.com/watch?v=P_Sjn67jIJY. W każdym razie, ponieważ jestem nowy w rozwoju Androida, czy ktokolwiek może gdzieś poprowadzić, aby zbudować coś takiego na wideo? Zainstalowałem już port opencv na Androida i zbudowałem przykład cvcamera z powodzeniem używając Eclipse. Dzięki, ThanosPrzepływ optyczny Android z opencv

Odpowiedz

1

Zobacz ten przepływ optyczny Stanford OpenCV link. Rzeczy powinny działać w zasadzie w ten sam sposób, z tym wyjątkiem, że połączenia mogą się nieznacznie różnić z powodu problemów związanych z interfejsem C i C++ w wersjach 1.x vs. 2.x.

Wystarczy edytować przykład CVCamera i powinno być szybkie. Zrobiłem aplikację do wykrywania twarzy w czasie rzeczywistym w ciągu około godziny od rozpoczęcia pracy z CVCamera.

+0

Ive już okazało się, że jednak mój brak wiedzy w Javie nie pozwól mi zrobić to uruchomić na Android .. = \ – thanos

+0

To pierwszy krok. Myślałem, że już zbudowałeś przykład CVCamera ze źródła i zainstalowałeś go. Zauważ, że to bardzo różni się od pobierania pliku .apk i grania z nim. – peakxu

+0

Zbudowałem już CVCamera używając powłoki cybina basha i otwieram ją za pomocą eclipse bez żadnych błędów. Zmieniłem również rozdzielczość, aby szybciej uruchomić wykrywanie funkcji, które ma CVCamera – thanos

0

Odwiedź http://opencv.willowgarage.com/wiki/Android2.3.0, OpenCV 2.3.0 Release Candidate ma dobre wsparcie dla Androida. Jest w nim przepływ optyczny .. używał go

+0

Dzięki za pomoc! Gdzie dokładnie jest próbka przepływu optycznego w opencv 2.3.0? Już go ściągnąłem i tak jak go szukałem, nie mogłem znaleźć żadnej implementacji przepływu optycznego, tylko znalazłem jak wykryć funkcje za pomocą FAST, SURF i STAR w CVCamera .. – thanos

+0

to jest próbka prawda? musisz napisać własną przy użyciu (cv :: calcOpticalFlowPyrLK) i ponownie zbudować z NDK [http://opencv.willowgarage.com/wiki/OpenCVAndroidBinariesBuild] – shernshiou

+0

, z drugiej strony możesz śledzić https://groups.google. com/group/android-opencv/browse_thread/thread/c0c011cb8e7f3e0C# Myślę, że ten facet skutecznie zbudował aplikację do przepływu optycznego – shernshiou

1

Chociaż staram się robić to samo, wydaje się, że teraz istnieje większe wsparcie dla przepływu optycznego w OpenCV4Android. Zobacz interfejsy API w org.opencv.video OpenCV Java documentation Widzę calcOpticalFlowPyrLK i calcOpticalFlowFarneback. Udało mi się przekonać calcOpticalFlowFarneback do pracy (chociaż wyniki nie sprawdziły się najlepiej, być może trzeba poprawić parametry) calcOpticalFlowPyrLK okazuje się trudny. Nie mogę przekonwertować punktów kluczowych zwróconych przez klasę FeatureDetector (MatOfKeyPoint) do punktów wymaganych przez calcOpticalFlowFarneback (MatOfPoint2f) other thread

0

Ten kod pomoże ci uzyskać wektor optyczny. I to będzie śledzić ich

@Override publicznego Mat onCameraFrame (CvCameraViewFrame inputFrame) {

mRgba = inputFrame.rgba(); 
    if (mMOP2fptsPrev.rows() == 0) { 

     //Log.d("Baz", "First time opflow"); 
     // first time through the loop so we need prev and this mats 
     // plus prev points 
     // get this mat 
     Imgproc.cvtColor(mRgba, matOpFlowThis, Imgproc.COLOR_RGBA2GRAY); 

     // copy that to prev mat 
     matOpFlowThis.copyTo(matOpFlowPrev); 

     // get prev corners 
     Imgproc.goodFeaturesToTrack(matOpFlowPrev, MOPcorners, iGFFTMax, 0.05, 20); 
     mMOP2fptsPrev.fromArray(MOPcorners.toArray()); 

     // get safe copy of this corners 
     mMOP2fptsPrev.copyTo(mMOP2fptsSafe); 
     } 
    else 
     { 
     //Log.d("Baz", "Opflow"); 
     // we've been through before so 
     // this mat is valid. Copy it to prev mat 
     matOpFlowThis.copyTo(matOpFlowPrev); 

     // get this mat 
     Imgproc.cvtColor(mRgba, matOpFlowThis, Imgproc.COLOR_RGBA2GRAY); 

     // get the corners for this mat 
     Imgproc.goodFeaturesToTrack(matOpFlowThis, MOPcorners, iGFFTMax, 0.05, 20); 
     mMOP2fptsThis.fromArray(MOPcorners.toArray()); 

     // retrieve the corners from the prev mat 
     // (saves calculating them again) 
     mMOP2fptsSafe.copyTo(mMOP2fptsPrev); 

     // and save this corners for next time through 

     mMOP2fptsThis.copyTo(mMOP2fptsSafe); 
     } 


    /* 
    Parameters: 
     prevImg first 8-bit input image 
     nextImg second input image 
     prevPts vector of 2D points for which the flow needs to be found; point coordinates must be single-precision floating-point numbers. 
     nextPts output vector of 2D points (with single-precision floating-point coordinates) containing the calculated new positions of input features in the second image; when OPTFLOW_USE_INITIAL_FLOW flag is passed, the vector must have the same size as in the input. 
     status output status vector (of unsigned chars); each element of the vector is set to 1 if the flow for the corresponding features has been found, otherwise, it is set to 0. 
     err output vector of errors; each element of the vector is set to an error for the corresponding feature, type of the error measure can be set in flags parameter; if the flow wasn't found then the error is not defined (use the status parameter to find such cases). 
    */ 
    Video.calcOpticalFlowPyrLK(matOpFlowPrev, matOpFlowThis, mMOP2fptsPrev, mMOP2fptsThis, mMOBStatus, mMOFerr); 

    cornersPrev = mMOP2fptsPrev.toList(); 
    cornersThis = mMOP2fptsThis.toList(); 
    byteStatus = mMOBStatus.toList(); 

    y = byteStatus.size() - 1; 

    for (x = 0; x < y; x++) { 
     if (byteStatus.get(x) == 1) { 
      pt = cornersThis.get(x); 
      pt2 = cornersPrev.get(x); 

      Core.circle(mRgba, pt, 5, colorRed, iLineThickness - 1); 

      Core.line(mRgba, pt, pt2, colorRed, iLineThickness); 
      } 
     } 

return mRgba; 

    } 
Powiązane problemy