Усі результати Google для openCV стверджують однаково: цей python буде лише трохи повільнішим. Але жодного разу я не бачив жодного профілювання цього. Тому я вирішив зробити кілька і виявив:
Python значно повільніший за C ++ з opencv, навіть для тривіальних програм.
Найпростіший приклад, який я міг подумати, - це відображення результатів роботи веб-камери на екрані та відображення кількості кадрів в секунду. За допомогою python я досяг 50 кадрів в секунду (на атомі Intel). З C ++ я отримав 65 кадрів в секунду, збільшення на 25%. В обох випадках використання центрального процесора використовувало одне ядро, і, наскільки мені відомо, це було пов'язано з продуктивністю центрального процесора. Крім того, цей тестовий приклад про узгодження з тим, що я бачив у проектах, які я переносив з одного на інший у минулому.
Звідки ця різниця? У python всі функції openCV повертають нові копії матриць зображень. Кожного разу, коли ви захоплюєте зображення або змінюєте його розмір - у C ++ ви можете повторно використовувати наявну пам’ять. У python ви не можете. Я підозрюю, що цей час, витрачений на виділення пам’яті, є основною відмінністю, оскільки, як казали інші: основним кодом openCV є C ++.
Перш ніж викидати python у вікно: python набагато швидше розвивається, і якщо ви не стикаєтесь з апаратними обмеженнями або якщо швидкість розробки важливіша за продуктивність, використовуйте python. У багатьох додатках, які я робив з openCV, я починав з python, а пізніше перетворив лише компоненти комп'ютерного зору на C ++ (наприклад, використовуючи модуль ctype python та компілюючи CV-код у спільну бібліотеку).
Код Python:
import cv2
import time
FPS_SMOOTHING = 0.9
cap = cv2.VideoCapture(2)
fps = 0.0
prev = time.time()
while True:
now = time.time()
fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING))
prev = now
print("fps: {:.1f}".format(fps))
got, frame = cap.read()
if got:
cv2.imshow("asdf", frame)
if (cv2.waitKey(2) == 27):
break
Код С ++:
#include <opencv2/opencv.hpp>
#include <stdint.h>
using namespace std;
using namespace cv;
#define FPS_SMOOTHING 0.9
int main(int argc, char** argv){
VideoCapture cap(2);
Mat frame;
float fps = 0.0;
double prev = clock();
while (true){
double now = (clock()/(double)CLOCKS_PER_SEC);
fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING));
prev = now;
printf("fps: %.1f\n", fps);
if (cap.isOpened()){
cap.read(frame);
}
imshow("asdf", frame);
if (waitKey(2) == 27){
break;
}
}
}
Можливі обмеження тесту:
- Частота кадрів камери
- Точність вимірювання таймера
- Час, витрачений на форматування друку
C
будь-якому випадку виконується за кулісами кодом OpenCV , тому за умови, що ваш власний код не надто продуманий, різниця не повинна бути такою великою, як ви наївно очікуєте.