OpenCV Python SIFT быстрее, чем C ++ - PullRequest
0 голосов
/ 15 апреля 2019

Я работаю над попыткой обнаружить функции с помощью OpenCV. Я использую алгоритм SIFT, встроенный в OpenCV. Я пробовал тестировать код с версиями OpenCV для Python и C ++, и по какой-то причине версия Python стала намного быстрее. Я не понимаю, почему версия C ++ намного медленнее. Разве они не должны быть одинаковыми скоростями?

Мой код Python в основном выглядит следующим образом:

img1 = cv2.imread(image1Path, 0)
img2 = cv2.imread(image2Path, 0)
sift = cv2.xfeatures2d.SIFT_create()
print(time.clock())
kp1,des1 = sift.detectAndCompute(img1, None)
kp2,des2 = sift.detectAndCompute(img2, None)
print(time.clock())

Мой код на C ++ выглядит следующим образом:

Mat img1 = imread(image1Path, 0)
Mat img2 = imread(image2Path, 0)
Ptr<SIFT> sift = SIFT::create();

std::vector<KeyPoint> img1_keypoints;
Mat img1_descriptors;
std::vector<KeyPoint> img2_keypoints;
Mat img2_descriptors;

double freq = getTickFrequency();
int64 start = getTickCount();
sift->detectAndCompute(img1, Mat(), img1_keypoints, img1_descriptors);
sift->detectAndCompute(img2, Mat(), img2_keypoints, img2_descriptors);
int64 end = getTickCount();
double time = (end - start) / freq;
cout << "Time: " << time << endl;

Одно из моих изображений довольно большое, в результате чего в img2 было найдено около 80 000 объектов. Когда я проверяю время, необходимое для запуска, код Python занимает около 5 секунд. Когда я пробую код на C ++, это занимает около 20 секунд. Код почти такой же, и мой временный код окружает только функции deteAndCompute (), так что это в основном только OpenCV, который синхронизируется.

Для C ++ я использую OpenCV 3.4.5. Для Python я использую OpenCV-python 3.4.2. Я не думаю, что эти версии должны иметь огромную разницу, поэтому я действительно не уверен, в чем может быть проблема.

Edit: Как следует из комментариев, я попытался скомпилировать и запустить свою программу на C ++ в режиме выпуска. Теперь он запускается примерно через 3-4 секунды, поэтому я думаю, что это проблема.

Подобно тому, как я обращаюсь к людям, у которых может быть такая же проблема, как и у меня, когда я перешел из режима отладки в режим выпуска в Visual Studio 2017, я получил ошибку доступа к памяти с классом std :: vector в строке :

sift->detectAndCompute(img1, Mat(), img1_keypoints, img1_descriptors);

Я решил проблему, зайдя в свойства своего проекта, Linker> Input> Additional Dependencies и удалив из конфигурации «opencv_world345d.lib». Вместо этого вам нужно открыть файл opencv_world345.lib при работе в режиме релиза.

Спасибо за помощь всем.

...