cv :: imread () не работает в проекте c ++, когда мы смешиваем opencv и dlib

У меня есть проект 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() для детектора на основе HOG + SVM на основе dlib.

Я добавил каталог include обоих проектов, каталоги 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
}

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

Пока я просто копал, что делает это неудачным, я узнал, что если я удалю запись dlib19.19.0_debug_32bit_msvc1924.lib из свойств-> Linker-> Input-> Additional Dependencies, тогда frame.empty() вернет false, и программа продолжится.

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


person Amogh    schedule 28.01.2020    source источник
comment
Еще одно наблюдение. Даже если я удалю все коды, относящиеся к dlib (detectFaceBydlibHOG (), #include записи, using), тогда также произойдет сбой cv :: imread (). Как только я удаляю запись dlib19.19.0_debug_32bit_msvc1924.lib из дополнительных зависимостей, программа читает изображение.   -  person Amogh    schedule 28.01.2020
comment
Итак, когда вы запускаете код только с помощью imread без dlib, работает ли он правильно?   -  person Yunus Temurlenk    schedule 28.01.2020
comment
@YunusTemurlenk, да. Как я уже сказал в своем первом комментарии. Когда я удаляю запись dlib .lib из дополнительных зависимостей, imread() работает должным образом.   -  person Amogh    schedule 28.01.2020
comment
Вы построили dlib с libjpeg, а libpng встроили в него статически? Вероятно, он конфликтует с аналогичной копией этих библиотек, статически встроенной в ваш файл opencv .lib. Просто перестройте dlib без этого, если вы не используете эти библиотеки.   -  person Davis King    schedule 28.01.2020
comment
Или свяжите opencv и dlib с одними и теми же библиотеками libjpeg и libpng.   -  person Davis King    schedule 28.01.2020
comment
@DavisKing Вы построили dlib с libjpeg, а libpng встраивала в него статически? В папке lib openCV я вижу libjpeg-turbod.lib файл, но в папке lib Dlib я вижу только dlib19.19.0_debug_32bit_msvc1924.lib файл. Означает ли это, что сборка Dlib без libjpeg?   -  person Amogh    schedule 28.01.2020
comment
@DavisKing В Cmake включен DLIB_JPEG_SUPPORT. Я снова строю Dlib после того, как закончил.   -  person Amogh    schedule 28.01.2020
comment
@DavisKing, Бинго !!! :) Мужик ты просто классный. Как вы сказали, это связано с конфликтом между libjpeg. OpenCV уже построен с помощью libjpeg, и эта библиотека уже добавлена ​​в Дополнительные зависимости, а затем, когда я создаю dlib, я оставил DLIB_JPEG_SUPPORT по умолчанию, поэтому dlib также строится статически с libjpeg и, следовательно, возникает конфликт. Спасибо чувак!! Я не думаю, что без этой помощи, я один, я смог бы его отследить.   -  person Amogh    schedule 28.01.2020
comment
Ха, без проблем :)   -  person Davis King    schedule 28.01.2020
comment
@DavisKing Пожалуйста, обновите ответ и дайте мне удовольствие поблагодарить вас :). Я (мы) хотел бы узнать от вас точную причину этого.   -  person Amogh    schedule 28.01.2020


Ответы (1)


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

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

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

person Davis King    schedule 28.01.2020
comment
Можем ли мы связать DLib со статической библиотекой OpenCV LIBJPEG? Должны ли мы просто создать DLib без DLIB_JPEG_SUPPORT и ожидать, что он свяжется с OpenCV LIBJPEG? Спасибо. - person Cypher; 17.11.2020