当我们混合 opencv 和 dlib 时,cv::imread() 在 c++ 项目中失败

cv::imread() fails in c++ project when we mix opencv and dlib

我在 visual studio 2019 年创建了一个 c++ 项目。我编译并构建了 openCV 4.2.0 版和 dlib 19.19.0 版,并在我的 c++ 项目中使用。我在单个项目中使用 opencv 和 dlib 的座右铭是我想使用 opencv 的 DNN (caffe) 和 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
}

当我使用这个函数时,我收到异常 "provided image file is not found or unable to open." 如果 frame.empty() return 为真则抛出异常。控制台上没有显示其他异常。

在挖掘导致失败的原因时,我了解到,如果我从 Properties->Linker->Input->Additional Dependencies 中删除 dlib19.19.0_debug_32bit_msvc1924.lib 条目,那么 frame.empty() returns false,程序继续。

但我还是不明白,为什么我在单个 C++ 项目中使用 opencv 和 dlib 时 cv::imread() 失败?

您是否使用 libjpeg 和 libpng 静态构建 dlib?它可能与静态构建到您的 opencv .lib 文件中的那些库的类似副本冲突。如果您不使用这些库,只需重建 dlib 即可。

或者link opencv 和 dlib 到相同的 libjpeg 和 libpng 库。

Dlib 的 cmake 文件将尝试 link 使用 libjpeg 和 libpng,如果找不到系统副本,将构建并静态 link dlib/external 中的副本。您可以通过设置 DLIB_JPEG_SUPPORTDLIB_PNG_SUPPORT

来控制 cmake 是否会尝试 link 这些东西