cv :: imread () терпит неудачу в проекте c ++, когда мы смешиваем opencv и dlib - PullRequest
0 голосов
/ 28 января 2020

У меня есть проект c ++, созданный в visual studio 2019. Я скомпилировал и собрал openCV версии 4.2.0 и dlib версии 19.19.0 и использовал его в своем проекте c ++. Мой девиз с использованием opencv и dlib в одном проекте: я хочу сделать обнаружение лица, используя DNN (caffe) в opencv и детектор лица dlib на основе hog + svm (get_frontal_face_detector ()).

Мои обе функции разделены, т.е. detectFaceByOpenCVDNN() для обнаружения лиц на основе opencv и detectFaceBydlibHOG() для детекторов на основе dlib HOG + SVM.

Я добавил каталог включений обоих проектов, каталоги lib (дополнительные каталоги библиотек) и упомянул дополнительные зависимости с файлами .lib.

Сборка этого проекта успешна и генерирует .lib файл. Используя этот файл, другое консольное приложение c ++ вызывает detectFaceByOpenCVDNN() (детектор лица opencv).

Код detectFaceByOpenCVDNN():

#include <opencv2/imgcodecs.hpp>
#include <opencv2/dnn/dnn.hpp>

#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>

using namespace dlib;
using namespace std;
using namespace cv::dnn;

void namespace_name::FaceDetection::detectFaceByOpenCVDNN(std::string filename)
{    

Net net;        
cv::Mat frame = cv::imread(filename);

if (frame.empty())
    throw std::exception("provided image file is not found or unable to open.");

int frameHeight = frame.rows;
int frameWidth = frame.cols;
    .... // code continues
}

Когда я получаю эту функцию, я получаю исключение как " предоставленный файл изображения не найден или не может быть открыт. " который бросается, если frame.empty() возвращает true. Никаких других исключений на консоли не отображается.

При копании всего, что делает этот сбой, я узнал, что, если я удаляю запись dlib19.19.0_debug_32bit_msvc1924.lib из Свойства-> Компоновщик-> Ввод-> Дополнительные зависимости, то frame.empty() возвращает false и программа продолжается.

Но я до сих пор не понимаю, почему cv :: imread () завершается неудачно, когда я использую opencv и dlib в одном проекте c ++?

1 Ответ

1 голос
/ 28 января 2020

Вы собирали dlib с помощью libjpeg, а libpng собирал статически в него? Вероятно, это конфликтует с аналогичной копией этих библиотек, которые статически встраиваются в ваш файл opencv .lib. Просто перестройте dlib без этого, если вы не используете эти библиотеки.

Или свяжите оба opencv и dlib с одинаковыми библиотеками libjpeg и libpng.

Файлы dmab cmake попытаются связать с libjpeg и libpng, и, если они не могут найти системную копию, она создаст и статически свяжет копию в dlib / external. Вы можете контролировать, будет ли cmake пытаться связываться с этими вещами, установив DLIB_JPEG_SUPPORT и DLIB_PNG_SUPPORT

...