#python #c #dlib
#python #c #dlib
Вопрос:
Я написал код python с использованием dlib, но из-за особенностей проекта мне нужно переписать тот же код на C . Это почти все сделано, но самое главное, я не смог найти точный эквивалент в C .
Версия python:
[boxes, confidences, detector_idxs] = dlib.fhog_object_detector.run_multiple(detectors, image, upsample_num_times=1, adjust_threshold=0.0)
C , который я пробовал, это:
vector<rectangle> detection = evaluate_detectors(detectors, img, adjust_threshold);
Я все еще не запускал код, но я не уверен, что эта функция, которую я использовал в C , вернет три информации (поля, confidencies, detector_idxs), как в python, из того, что я вижу, я думаю, что она вернет только поля.
Вы знаете, правильно ли я это делаю? Как я могу получить эти три информации, которые мне нужны?
РЕДАКТИРОВАТЬ 01: ошибки при использовании функции:
tuple<std::vector<dlib::rectangle>, list<T> confidences>, list<T> detector_idxs> = run_multiple_rect_detectors(detectores, img, upsampling_amount, adjust_threshold);
error C2065: 'T': undeclared identifier
error C2923: 'std::list': 'T' is not a valid template type argument for parameter '_Ty'
error C2903: 'allocator': symbol is neither a class template nor a function template
error C3203: 'allocator': unspecialized class template can't be used as a template argument for template parameter '_Alloc', expected a real type
error C2146: syntax error: missing '>' before identifier 'confidences'
error C2059: syntax error: ','
РЕДАКТИРОВАТЬ 01-1:
error C2872: 'rectangle': ambiguous symbol
note: could be 'dlib::rectangle'
note: or 'rectangle'
error C2146: syntax error: missing '>' before identifier 'rectangles'
error C2653: 'pybind11': is not a class or namespace name
error C3861: 'run_multiple_rect_detectors': identifier not found
После исправления синтаксических ошибок, показанных VS:
error C3861: 'run_multiple_rect_detectors': identifier not found
РЕДАКТИРОВАТЬ 02:
Error C2027 use of undefined type 'dlib::image_traits<image_type>'
Error C2146 syntax error: missing ';' before identifier 'pixel_type'
Error C4430 missing type specifier - int assumed. Note: C does not support default-int
Комментарии:
1. Вы можете проверить исходный код привязки Python и посмотреть, что он делегирует.
2. Вам следует взглянуть на пример детектора объектов C HOG . Это довольно просто для стандартов C .
3. Зачем переписывать код, который работает? Вызовите код python из C .
4. Я также пытаюсь использовать FHOG в C , но у меня возникли некоторые проблемы с типом переменных, это не так просто, как в python
5. @NicolasZ. DLib — это сильно шаблонная библиотека. Я рекомендую сначала взглянуть на шаблоны C . C сильно отличается от Python.
Ответ №1:
run_multiple(...)
похоже, что он вызывает run_multiple_rect_detectors(…), Предполагая, что это так, вы должны иметь возможность вызывать:
std::tuple<std::vector<rectangle> rectangles, std::vector<double> confidences, std::vector<unsigned long> detector_idxs> detection = dlib::run_multiple_rect_detectors(detectors, img, 1, 0.0);
1
— это объем выборки и 0.0
пороговое значение.
поскольку pybind автоматически преобразует между кортежами C 11 и Python.
Затем вы можете разделить кортеж на разные векторы с помощью std::vector rectangles = detection.first() и так далее для detection.second() и detection .третий ().
Комментарии:
1. Спасибо, но, к сожалению, это не сработало, у меня несколько ошибок при вызове этой функции в VS2017
2. Этот код является прославленным псевдокодом; Я не знаю ни типов
confidences
, ,detector_idxs
, ни аргументов для функции. Убедитесь, что компиляция с библиотекой pybind прошла успешно. Кроме того, если вы отредактируете вопрос с помощью трассировки стека, я был бы рад помочь.3. Извините, что слишком долго отвечаю, сейчас я отредактирую вопрос
4. Я протестировал ваш код jackw11111, но при попытке его запустить у меня возникли некоторые ошибки, я отредактировал свой вопрос с его помощью (РЕДАКТИРОВАТЬ 01-1). Я исправил некоторые синтаксические ошибки, которые показал VS, но функцию run_multiple_rect_detectors() я не мог вызвать ни из одного файла заголовка, я перепробовал их много. Я искал в Интернете и видел, что функция c evaluate_detectors(), которую я пробовал, может быть правильной, но, к сожалению, я получаю ошибки при ее запуске (EDIT 02).
5. Я понял, я сделал свою собственную версию get_frontal_face_detector() для другого объекта, при этом мне не нужно вызывать внешний svm-файл. Я определенно могу сказать, что это было проще, чем то, что я пытался сделать раньше. Большое вам спасибо за вашу помощь!