我在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的检测器。
我添加了两个项目的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
}
当我执行此功能时,会收到异常消息,例如“找不到或无法打开提供的图像文件”。如果frame.empty()
返回true ,则抛出该异常。控制台上不会显示其他异常。
虽然只是在研究使失败的原因,但我知道,如果我dlib19.19.0_debug_32bit_msvc1924.lib
从Properties-> Linker-> Input-> Additional Dependencies中删除条目,则frame.empty()
返回false,然后程序继续。
但是我仍然不明白,为什么在单个c ++项目中使用opencv和dlib时cv :: imread()失败?
您是否使用libjpeg和dbpng静态构建了dlib?这可能与静态构建在您的opencv .lib文件中的这些库的相似副本冲突。如果不使用这些库,只需重建dlib即可。
或将opencv和dlib链接到相同的libjpeg和libpng库。
Dlib的cmake文件将尝试与libjpeg和libpng链接,如果找不到,则会生成系统副本并将其静态链接到dlib / external中。您可以通过设置DLIB_JPEG_SUPPORT
和控制cmake是否尝试链接到这些东西。DLIB_PNG_SUPPORT
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句