Як я можу пришвидшити пристрій Android-openCV?

Я реалізував openCV-додаток, де я використовую дескриптор SURF. Це добре працює, код виглядає так:

Знижує розмір потоку вхідного відео, щоб прискорити його

            capture.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, display.getWidth());
            capture.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, display.getHeight());

            capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);

            try{

          //-- Step 1: Detect the keypoints using SURF Detector

            surfDetector.detect( mRgba, vector1 );

            for (KeyPoint t : vector1)
                Core.circle(mRgba, t.pt, 10, new Scalar(100, 100,100));    

          //-- Step 2: Calculate descriptors (feature vectors)
            //extractor.compute(mRgba, vector1, descriptor1);

          //-- Draw matches
            //Mat img_matches;
            //drawMatches( mRgba, vector1, mRgba, vector1, matches, img_matches );


            }catch(Exception e){
                Log.e( "ERROR", e.toString());

            }

Але розрахунок все ще є занадто повільним, тому мені потрібно знайти ще один спосіб зменшити qualllity потоку вхідного відео. Або якщо ви знаєте інший метод, щоб прискорити це, не соромтеся поділитися ним зі мною;)

Thanks for your time & answers

17
@Csabi А також які обмеження ви говорите?
додано Автор Shubhadeep Chaudhuri, джерело
@Сабі Ви змогли прискорити це? У мене така ж проблема.
додано Автор Shubhadeep Chaudhuri, джерело
@Ссабі Добре, як щодо точності. Чи можна порівняти з SURF? А про те, скільки частот кадрів ви отримуєте?
додано Автор Shubhadeep Chaudhuri, джерело
Чи зробили ви профільмування профілів? Я мав можливість, що корінні дзвінки з давліку досить дорогі. Також дуже дорого для доступу до пам'яті пам'яті, виділеного з камери
додано Автор Konstantin Pribluda, джерело
Я не встановлю це, це деффло, але я не міг вміти встановити це, або що є оптимальне значення для preformance/vision
додано Автор Csabi, джерело
@ TimManx обмеженнями є, наприклад, рівень обізнаності, а прибутковість до, я отримую майже в 10 разів більше кадрів, що використовуються при пошуку. Але ви повинні спробувати це на ваш проект
додано Автор Csabi, джерело
@TimeManx Я використовую orb, з більшою базою зразків образів, це набагато швидше, але у нього є свої обмеження, я не зміг прискорити Surf
додано Автор Csabi, джерело
Я дійсно не розумію ваше запитання, але відповідь буде скоріше не так.
додано Автор Csabi, джерело
Але якщо ви хочете, щоб вихідний відеосигнал FPS становив 1 кадр за 4-5 секунд, це так жахливо
додано Автор Csabi, джерело
який пристрій ви використовуєте для тестів?
додано Автор MobileCushion, джерело
так, але що це таке?
додано Автор MobileCushion, джерело
Яка ваша частота кадрів?
додано Автор MobileCushion, джерело

2 Відповіді

Але розрахунок все ще є занадто повільним, тому мені потрібно знайти інше   Метод зменшення qualllity потоку вхідного відео.

Справжня відповідь на це питання набагато ближче до того, що "нема чого ви можете зробити!" ніж щось інше. Ми повинні визнати, що мобільні телефони не мають жорстких можливостей обробки, як-от будь-який робочий стіл. Більшість телефонів Android в усьому світі все ще використовують попередні версії системи, і найважливіше всього: вони є одноядерними пристроями, вони частоти на швидкості нижче 1 ГГц, вони мають обмежену пам'ять, бла-бла ...

Тим не менш, завжди є щось, що ви можете зробити, щоб поліпшити швидкість з невеликими змінами у продуктивності.

Тепер я також обчислюю OpenCV SURF на GalaxyS, і я маю частоту кадрів 1,5 кадри в секунду для 200 функцій з порогом Гессіана на 1500 у зображенні 320x240. Я визнаю, що це дерьмо, але в моєму випадку мені доводиться лише обчислювати функції кожні раз на час, тому що я вимірюю оптичний потік для цілей відстеження. Однак дуже дивно, що ви можете отримати лише 1 кадр кожні 4-5 секунд.

1) По-перше, мені здається, що ви використовуєте VideoCapture для отримання кадрів камери. Ну, я ні. Я використовую реалізацію камери Android. Я не перевіряв, як VideoCapture реалізується в порті Java OpenCV, але, як видається, це відбувається повільніше, ніж використання деяких навчальних програм. Однак я не можу бути впевненим у цьому на 100%, оскільки я не протестував це. Ти?

2) Знизити національні дзвінки до мінімального можливого. Внутрішні виклики Java OpenCV коштують дорого. Також дотримуйтесь усіх правил, зазначених у сторінці найкращих практик Android-OpenCV . Якщо у вас є декілька вихідних дзвінків, приєднайте їх до одного дзвінка JNI.

3) Ви також повинні зменшити розмір зображення та збільшити пороговість Hessian SURF. Це, однак, зменшить кількість виявлених функцій, але вони будуть міцнішими та надійнішими для розпізнавання та узгодження. Ви маєте рацію, коли ви кажете, що SURF є надійним детектором (він також є найнижчим і запатентованим). Але, якщо це не є мертвим блокуванням для вас, я б рекомендував використовувати новий детектор ORB, варіант БЛОКОВОГО, який краще працює з точки зору обертання. Хоча ORB має недоліки, такі як обмежена кількість виявлених ключових точок та погана масштабна інваріантність. Це є дуже цікавий алгоритм виявлення алгоритмів порівняння звіту. Це також говорить про те, що детектор SURF працює повільніше в новій версії OpenCV 2.3.1, можливо, через деякі зміни в алгоритмі, для підвищення стійкості.

4) Now the fun bits. The ARM processor architecture (in which most of the Android phones are based) has been widely reported for its slowness handling floating point calculations, in which feature detector algorithms rely heavily. There have been very interesting discussions about this issue, and many say you should use fixed-point calculations whenever possible. The new armv7-neon architecture provides faster floating point calculations, but not all devices support it. To check if your device does support it, run adb shell cat proc/cpuinfo. You can also compile your native code with NEON directives (LOCAL_ARM_NEON := true) but I doubt this will do any good, since apparently few OpenCV routines are NEON optimized. So, the only way to increase speed with this, is to rebuild the code with NEON intrinsics (this is completely unexplored ground for me, but you might find it worth looking). In the android.opencv group it was suggested that future OpenCV releases will have more NEON-optimized libraries. This could be interesting, however I am not sure if it is worth working on it or wait for faster CPUs and optimized systems using GPU computing. Note that Android systems < 3.0 do not use built-in hardware acceleration.

5) Якщо ви робите це в академічних цілях, переконайте свій університет придбати вам кращий пристрій ^ ^. Це може бути, нарешті, найкращим варіантом для швидшого виявлення функцій SURF. Інший варіант - переписати алгоритми. Я знаю, що деякі хлопці в лабораторіях Intel це зробили, з певним успіхом, але, очевидно, вони не поділяться. Чесно кажучи, після вивчення цього питання протягом кількох тижнів я зрозумів, що для моїх специфічних потреб (і оскільки я не фахівець з інформатики та експертів з алгоритмів), більше вартості чекати на кілька місяців для кращих пристроїв, ніж задирати голову на стіні розбиває алгоритми та розробляє код зближення збірки.

З повагою і удачею!

36
додано
Ласкаво просимо до 2015 року, де ми маємо пристрої з 8 ядер
додано Автор Dmitry Zaytsev, джерело
@DmitryZaitsev І все-таки OpenCV's warpPerspective займає ~ 250 мсек для деформації зображення на розмір розміром 920x720 для мене, на чотирьохядерному 2,3 ГГц Snapdragon 800 з 2 Гб оперативної пам'яті. Див: stackoverflow.com/questions/32880842/ …
додано Автор bad_keypoints, джерело
Більш цікаве уявлення про ці теми Евгена Хведченія: комп'ютерні зору-переговори .com/2012/04/reader-questions-1
додано Автор MobileCushion, джерело
Я також відчуваю дуже повільну частоту кадрів з деякими функціями OpenCV, які виявляють кути Snapdragon. Я планую зробити постріл для FastCV . Хто-небудь хтось тут коментує FastCV?
додано Автор jairobjunior, джерело
@жайrobjunior Так. Я намагався використовувати його, і це, безумовно, дуже складний інструмент для використання - документація надзвичайно обмежена. Крім того, згідно з версією v1.7.1, передбачено лише один ML api; класифікатор SVM.
додано Автор Rishabh Bhardwaj, джерело

Вам потрібно використовувати функцію/дескриптор SURF для вашої програми? SURF є привабливим, оскільки він дуже гарний, але, як ви дізналися, це дещо повільне. Якщо ви просто відстежуєте очки за допомогою відео, ви можете зробити припущення, що точка не змінюватимуть багато кадрів на кадрі, і ви зможете виявляти та відповідати кутами Harris/FAST, а потім фільтрувати матчі, щоб вони були дійсними, лише якщо вони знаходяться в межах радіус x-пікселя оригінальної точки?

OpenCV має (хоч і дещо обмежений) вибір детекторів функцій та екстрактори дескрипторів та descriptor matchers , варто дослідити варіанти, якщо ви ще цього не зробили.

2
додано
Так, я знаю, але SURF більш надійний, я можу використовувати FAST або Harris Corner ... Але питання в тому, як я можу прискорити код, який використовує SURF
додано Автор Csabi, джерело
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.