2011-06-28 33 views
6

Tôi đang cố gắng triển khai luồng quang trong Android bằng cách sử dụng openCV http://code.google.com/p/android-opencv/. Về cơ bản tôi muốn xây dựng một cái gì đó như thế này http://www.youtube.com/watch?v=P_Sjn67jIJY. Dù sao vì im mới để phát triển Android có thể bất cứ ai hướng dẫn một nơi nào đó để xây dựng một cái gì đó giống như một trên video? Ive đã cài đặt cổng opencv cho android và xây dựng ví dụ cvcamera thành công bằng cách sử dụng nhật thực. Cảm ơn, ThanosLuồng quang học Android với opencv

Trả lời

1

Xem luồng quang học Stanford OpenCV này link. Những điều cần làm việc về cơ bản theo cùng một cách ngoại trừ các cuộc gọi có thể hơi khác nhau do 1.x so với các vấn đề C + C++ API của 2.x.

Chỉ cần chỉnh sửa ví dụ CVCamera và nó sẽ nhanh chóng. Tôi đã thực hiện ứng dụng phát hiện khuôn mặt trong thời gian thực trong khoảng một giờ sau khi CVCamera hoạt động.

+0

Ive đã phát hiện ra rằng nhưng tôi thiếu kiến ​​thức trong java dont hãy để tôi làm cho nó chạy cho android .. = \ – thanos

+0

Đó là bước đầu tiên. Tôi nghĩ rằng bạn đã xây dựng ví dụ CVCamera từ nguồn và cài đặt nó. Lưu ý, điều này rất khác với việc tải xuống tệp .apk và chơi với nó. – peakxu

+0

Tôi đã tạo CVCamera bằng cách sử dụng vỏ bash Cygwin và mở nó bằng nhật thực mà không có bất kỳ lỗi nào. Ngoài ra, thay đổi độ phân giải để chạy nhanh hơn tính năng phát hiện CVCamera có – thanos

0

Ghé thăm http://opencv.willowgarage.com/wiki/Android2.3.0, OpenCV 2.3.0 Release Candidate có hỗ trợ tốt cho Android. Có dòng quang bên trong nó .. sử dụng nó

+0

Cảm ơn sự giúp đỡ của bạn! Trường hợp chính xác là mẫu lưu lượng quang học trong opencv 2.3.0? Tôi đã tải về nó và như fas như ive tìm kiếm tôi couldt tìm thấy bất kỳ thực hiện lưu lượng quang học, tôi chỉ tìm thấy làm thế nào để phát hiện các tính năng với FAST, SURF VÀ STAR trong CVCamera .. – thanos

+0

đó là mẫu phải không? bạn cần phải viết của riêng bạn bằng cách sử dụng (cv :: calcOpticalFlowPyrLK) và xây dựng lại với NDK [http://opencv.willowgarage.com/wiki/OpenCVAndroidBinariesBuild] – shernshiou

+0

, mặt khác, bạn có thể làm theo https://groups.google. com/group/android-opencv/browse_thread/thread/c0c011cb8e7f3e0C# i đoán fella này đã xây dựng thành công một ứng dụng dòng quang – shernshiou

1

Mặc dù tôi cũng đang cố gắng làm như vậy, có vẻ như sẽ hỗ trợ nhiều hơn cho luồng quang trong OpenCV4Android ngay bây giờ. Xem API trong org.opencv.video OpenCV Java documentation Tôi thấy calcOpticalFlowPyrLK và calcOpticalFlowFarneback. Tôi đã có thể nhận được calcOpticalFlowFarneback để làm việc (mặc dù kết quả dường như không tuyệt vời, có thể cần phải tinh chỉnh các tham số) calcOpticalFlowPyrLK đang chứng minh là khó khăn. Tôi không thể chuyển đổi các điểm chính được trả về bởi lớp FeatureDetector (MatOfKeyPoint) thành các điểm cần thiết bởi calcOpticalFlowFarneback (MatOfPoint2f) other thread

0

Mã này sẽ giúp bạn lấy các vectơ quang học. Và nó sẽ theo dõi chúng

@ Override công 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; 

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