使用 dlib::frontal_face_detector 时获取 C2027 使用未定义类型 'dlib::image_traits<image_type>' 错误
Getting C2027 use of undefined type 'dlib::image_traits<image_type>' error when using dlib::frontal_face_detector
我正在使用最新版本的 dlib 并尝试构建一个 DLL,使用它的 dlib::frontal_face_detector
和 dlib::shape_predictor predictor
来检测人脸。然而,
在尝试通过简单地使用 detector
时:
auto faces = this->detector(img, 0);
我得到这个编译错误:
Severity Code Description Project File Line Suppression State
Error C2146 syntax error: missing ';' before identifier 'pixel_type' Test D:\Codes\Dependencies\include\dlib\image_processing\scan_fhog_pyramid.h 601
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int Test D:\Codes\Dependencies\include\dlib\image_processing\scan_fhog_pyramid.h 601
Error C2027 use of undefined type 'dlib::image_traits<image_type>' Test D:\Codes\Dependencies\include\dlib\image_processing\scan_fhog_pyramid.h 601
代码如下所示:
#include <iostream>
#include <tuple>
#include <chrono>
#include <string>
#include <filesystem>
namespace fs = std::filesystem;
#include <functional>
//#include <torch/torch.h>
//#include <torch/script.h>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
//#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
class TEST_API Test
{
public:
Test(std::string shape_predictor_path = "");
void main_op(cv::Mat img_ori, bool show_debug_info = true);
~Test();
private:
dlib::frontal_face_detector detector;
dlib::shape_predictor predictor;
//torch::jit::script::Module net;
};
//in Test.cpp
#include <Test/Test.h>
Test::Test(std::string shape_predictor_path)
{
auto cdir = fs::current_path();
detector = dlib::get_frontal_face_detector();
auto landmark_path = shape_predictor_path == "" ? (cdir / "shape_predictor_68_face_landmarks.dat").string() : shape_predictor_path;
auto model_path = (cdir / "net_4.jit").string();
std::cout << "landmark path: " << landmark_path << "model path: " << model_path << std::endl;
dlib::deserialize(landmark_path) >> this->predictor;
//this->net = torch::jit::load(model_path);
}
void Test::main_op(cv::Mat img, bool show_debug_info)
{
try
{
//cv::Mat img_cpy(img);
//grayscale
cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
auto faces = this->detector(img, 0);
//....
}
catch(std::exception exp)
{
std::cout << exp.what() << std::endl;
}
}
我在 Visual Studio 2019 年使用 OpenCV3.4.11 和 libtorch1.6。语言设置为 C++17。
我的 C++ 预处理器中也有这些:
NDEBUG
_CONSOLE
_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
_CRT_SECURE_NO_WARNINGS
我正在使用 dlib 19.21,我包含了它的包含路径,并将 dlibs source.cpp
添加到我的 dll 项目中,并像这样构建我的项目。
这些也是我的构建选项:
/D_TEST_BUILD_DLL /bigobj
为什么我会看到这个错误?我在这里错过了什么?
更新:
在不使用任何其他库(例如 torch)的情况下,这种情况再次发生。所以这与任何其他图书馆无关。这是纯粹的 dlib/opencv!
该错误有点误导,该问题是由向 dlib::get_frontal_face_detector()
和 dlib::shape_predictor
对象提供 cv::Mat
引起的,导致所述错误。将其转换为预期类型解决了问题:
dlib::array2d<dlib::rgb_pixel> img_dlib;
dlib::assign_image(img_dlib, dlib::cv_image<dlib::bgr_pixel>(img));
auto faces = this->detector(img_dlib, 0);
更具体地说,当我们将输入图像转换为灰度时,我们可以简单地使用 cv_image<unsigned char>
代替:
dlib::array2d<unsigned char> img_dlib;
dlib::assign_image(img_dlib, dlib::cv_image<unsigned char>(img));
auto faces = this->detector(img_dlib, 0);
旁注
我实际上花了接下来的 14 个小时才达到我最初发布的相同解决方案,因为我完全错过了 dlib::shape_predictor
的输入,因为当我将检测器输入从 cv::Mat
更改为 dlib::array2d
错误依然存在!我认为情况并非如此,并开始了 14 小时的马拉松式建设和重建,以不同的风格和使用不同的方法最终达到这一点!
所以根据经验,提供所有 dlib 相关方法,dlib array2d!我不知道为什么在发生这种情况时它不会发出编译错误。
如果 dlib 在这种情况下专门发出错误,我们就不会面临这样的问题。
这是构建 dlib 并在 Visual Studio 中使用它的示例方法(在我的例子中,我用它来创建 DLL):
Part1-Building Dlib using Visual Studio 2019
我正在使用最新版本的 dlib 并尝试构建一个 DLL,使用它的 dlib::frontal_face_detector
和 dlib::shape_predictor predictor
来检测人脸。然而,
在尝试通过简单地使用 detector
时:
auto faces = this->detector(img, 0);
我得到这个编译错误:
Severity Code Description Project File Line Suppression State
Error C2146 syntax error: missing ';' before identifier 'pixel_type' Test D:\Codes\Dependencies\include\dlib\image_processing\scan_fhog_pyramid.h 601
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int Test D:\Codes\Dependencies\include\dlib\image_processing\scan_fhog_pyramid.h 601
Error C2027 use of undefined type 'dlib::image_traits<image_type>' Test D:\Codes\Dependencies\include\dlib\image_processing\scan_fhog_pyramid.h 601
代码如下所示:
#include <iostream>
#include <tuple>
#include <chrono>
#include <string>
#include <filesystem>
namespace fs = std::filesystem;
#include <functional>
//#include <torch/torch.h>
//#include <torch/script.h>
#include <dlib/opencv.h>
#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
//#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
class TEST_API Test
{
public:
Test(std::string shape_predictor_path = "");
void main_op(cv::Mat img_ori, bool show_debug_info = true);
~Test();
private:
dlib::frontal_face_detector detector;
dlib::shape_predictor predictor;
//torch::jit::script::Module net;
};
//in Test.cpp
#include <Test/Test.h>
Test::Test(std::string shape_predictor_path)
{
auto cdir = fs::current_path();
detector = dlib::get_frontal_face_detector();
auto landmark_path = shape_predictor_path == "" ? (cdir / "shape_predictor_68_face_landmarks.dat").string() : shape_predictor_path;
auto model_path = (cdir / "net_4.jit").string();
std::cout << "landmark path: " << landmark_path << "model path: " << model_path << std::endl;
dlib::deserialize(landmark_path) >> this->predictor;
//this->net = torch::jit::load(model_path);
}
void Test::main_op(cv::Mat img, bool show_debug_info)
{
try
{
//cv::Mat img_cpy(img);
//grayscale
cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);
auto faces = this->detector(img, 0);
//....
}
catch(std::exception exp)
{
std::cout << exp.what() << std::endl;
}
}
我在 Visual Studio 2019 年使用 OpenCV3.4.11 和 libtorch1.6。语言设置为 C++17。 我的 C++ 预处理器中也有这些:
NDEBUG
_CONSOLE
_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
_CRT_SECURE_NO_WARNINGS
我正在使用 dlib 19.21,我包含了它的包含路径,并将 dlibs source.cpp
添加到我的 dll 项目中,并像这样构建我的项目。
这些也是我的构建选项:
/D_TEST_BUILD_DLL /bigobj
为什么我会看到这个错误?我在这里错过了什么?
更新:
在不使用任何其他库(例如 torch)的情况下,这种情况再次发生。所以这与任何其他图书馆无关。这是纯粹的 dlib/opencv!
该错误有点误导,该问题是由向 dlib::get_frontal_face_detector()
和 dlib::shape_predictor
对象提供 cv::Mat
引起的,导致所述错误。将其转换为预期类型解决了问题:
dlib::array2d<dlib::rgb_pixel> img_dlib;
dlib::assign_image(img_dlib, dlib::cv_image<dlib::bgr_pixel>(img));
auto faces = this->detector(img_dlib, 0);
更具体地说,当我们将输入图像转换为灰度时,我们可以简单地使用 cv_image<unsigned char>
代替:
dlib::array2d<unsigned char> img_dlib;
dlib::assign_image(img_dlib, dlib::cv_image<unsigned char>(img));
auto faces = this->detector(img_dlib, 0);
旁注
我实际上花了接下来的 14 个小时才达到我最初发布的相同解决方案,因为我完全错过了 dlib::shape_predictor
的输入,因为当我将检测器输入从 cv::Mat
更改为 dlib::array2d
错误依然存在!我认为情况并非如此,并开始了 14 小时的马拉松式建设和重建,以不同的风格和使用不同的方法最终达到这一点!
所以根据经验,提供所有 dlib 相关方法,dlib array2d!我不知道为什么在发生这种情况时它不会发出编译错误。 如果 dlib 在这种情况下专门发出错误,我们就不会面临这样的问题。
这是构建 dlib 并在 Visual Studio 中使用它的示例方法(在我的例子中,我用它来创建 DLL):
Part1-Building Dlib using Visual Studio 2019