当我们混合 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_SUPPORT
和 DLIB_PNG_SUPPORT
来控制 cmake 是否会尝试 link 这些东西
我在 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_SUPPORT
和 DLIB_PNG_SUPPORT