将cv::Mat转换为dlib::cv_image失败求助,附报错及环境配置
解决cv::Mat转Dlib图像格式的编译错误
问题原因
你使用的Dlib 19.6.0属于较旧版本,其OpenCV接口依赖于旧的C风格IplImage类型,而OpenCV 3.x及以后默认采用C++风格的cv::Mat。当直接将cv::Mat传入dlib::cv_image构造函数时,内部尝试隐式转换const cv::Mat到IplImage失败,触发编译错误。
解决方案
方案1:显式转换cv::Mat到IplImage
修改转换代码,先将cv::Mat显式转为IplImage再传入dlib::cv_image:
// 替换原转换代码段 dlib::array2d<dlib::bgr_pixel> newImage; IplImage ipl_img = image; // 显式完成cv::Mat到IplImage的转换 dlib::assign_image(newImage, dlib::cv_image<dlib::bgr_pixel>(&ipl_img));
注意:若你的cv::Mat是const类型,需确保转换时权限匹配,当前代码中image为非const,可直接使用。
方案2:升级Dlib版本
Dlib 19.10及以后版本已完全适配OpenCV的cv::Mat类型,无需显式转换即可正常运行原代码。升级步骤如下:
- 卸载旧版本Dlib(源码编译安装的情况):
sudo rm -rf /usr/local/include/dlib /usr/local/lib/libdlib*
- 从Dlib官方仓库下载最新源码,解压后进入源码目录执行编译安装:
mkdir build && cd build cmake .. -DDLIB_USE_CUDA=OFF # 根据硬件需求决定是否开启CUDA支持 make -j$(nproc) sudo make install
额外的CMakeLists.txt优化
你的CMakeLists中include_directories("/usr/local/include/opencv4/opencv2")属于冗余配置,find_package(OpenCV REQUIRED)已自动处理OpenCV的头文件路径,删除该行可避免路径冲突:
cmake_minimum_required(VERSION 3.15) set(CMAKE_CXX_STANDARD 17) project( trainModel ) find_package( OpenCV REQUIRED ) find_package(dlib REQUIRED) add_executable( trainModel trainModel.cpp ) target_link_libraries( trainModel ${OpenCV_LIBS} dlib::dlib ) install( TARGETS trainModel DESTINATION bin)
验证修改
修改后重新编译项目:
mkdir build && cd build cmake .. make
内容的提问来源于stack exchange,提问作者yigitboracagiran
相关产品推荐
相关产品推荐

