深度学习系列之(dlib+opencv)代码收藏

1. dlib::array2d 与 cv::Mat 互转

dlib::array2d is an image already, you can use it for any dlib's image functions

//load image:
dlib::array2d<dlib::rgb_pixel> img_rgb;
dlib::load_image(img_rgb, "test_image.jpg");

//convert to greyscale:
dlib::array2d<unsigned char> img_gray;
dlib::assign_image(img_gray, img_rgb);

//converto to OpenCV Image (cv::Mat):
#include <dlib/op//cv.h>
#include <opencv2/opencv.hpp>
cv::Mat img = dlib::toMat(img_gray);

//get image from OpenCV:
#include <dlib/opencv.h>
#include <opencv2/opencv.hpp>
cv::Mat img = cv::imread("test_image.jpg")
dlib::cv_image<rgb_pixel> dlib_img(img); // only stores pointer, no deep copy

2)OpenCV Mat转dlib array2d

#include "opencv2/core/core_c.h" // shame, but needed for using dlib  
#include <dlib/image_processing.h>  
#include <dlib/opencv/cv_image.h>  

dlib::shape_predictor sp;  
dlib::deserialize(path_to_landmark_model) >> sp;  

cv::Rect r;  
cv::Mat I;  
dlib::rectangle rec(r.x, r.y, r.x+r.width, r.y+r.height);  
dlib::full_object_detection shape = sp(dlib::cv_image<uchar>(I), rec);  

2.截取原图的指定位置大小的区域

#用矩阵截取原图
cv::mat roi_img = src_img(Range(0,100),Range(50,200));
或者:cv::mat roi_img = src_img(mtrx.rows,mtrx.cols);
#用矩形截取原图大小
Rect rect(10, 20, 100, 50);
Mat image_roi = image(rect)
或者:
cv::Mat image_roi = src_img(cv::Rect(rec.left(), rec.top(), rec.width(), rec.height()));//前两个参数为左上角坐标(x,y),后两个为矩形的宽和高;

3.Main函数参数argc,argv如何传入

1)http://blog.csdn.net/guo_xiaoxi/article/details/57074891(vs工程中添加配置)
2)如下(dos命令端):

int main(int argc, char** argv)
int main(int argc, char* argv[])

这两个参数的作用是什么呢?argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。假如你的程序是hello.exe,如果在命令行运行该程序,(首先应该在命令行下用 cd 命令进入到 hello.exe 文件所在目录) 运行命令为:

hello.exe Shiqi Yu

那么,argc的值是 3,argv[0]是”hello.exe”(本身的地址),argv[1]是”Shiqi”,argv[2]是”Yu”。

4.vs2013运行dlib小程序报错:无法解析的外部命令

错误  2   error LNK2019: 无法解析的外部符号 "public: __cdecl dlib::entropy_decoder_kernel_2::entropy_decoder_kernel_2(void)" (??0entropy_decoder_kernel_2@dlib@@QEAA@XZ),该符号在函数 "void __cdecl dlib::load_dng<class dlib::array2d<unsigned char,class dlib::memory_manager_stateless_kernel_1<char> > >(class dlib::array2d<unsigned char,class dlib::memory_manager_stateless_kernel_1<char> > &,class std::basic_istream<char,struct std::char_traits<char> > &)" (??$load_dng@V?$array2d@EV?$memory_manager_stateless_kernel_1@D@dlib@@@dlib@@@dlib@@YAXAEAV?$array2d@EV?$memory_manager_stateless_kernel_1@D@dlib@@@0@AEAV?$basic_istream@DU?$char_traits@D@std@@@std@@@Z) 中被引用    E:\program-file\vs_project\face_pro\dlib_test\dlib_test\fece_detection2.obj dlib_test

每次看到这个错误脑袋就蒙圈,想不起来上次是怎么解决的了,记录一下:
1)检查dlib依赖项是否添加
2)检查自己的dlib项目类型,win32还是x64,(我的是win32,在x64下就会报上面的错)
3)win32和x64下面的依赖项是要分别添加的(才知道)
这里写图片描述

5.dlib读取文件时,不要通过重命名修改文件类型,往往导致unknown image foemat,要另存为的方式修改文件类型;

6.实例代码收藏

1)视频处理的人脸检测
http://blog.csdn.net/xiamentingtao/article/details/50968514
http://blog.csdn.net/sunmc1204953974/article/details/49976045
2)视频之关键点提取
http://blog.csdn.net/zmdsjtu/article/details/53454071
http://blog.csdn.net/zmdsjtu/article/details/53667929

7.vs2013 dlib opencv应用无法正常启动0xc00007b

重新配置了opencv:路径加入环境变量(之前一直偷懒没加,这次就报了这个错),检查项目中的opencv配置。

最终:(1)在dlib实例基础上实现了人脸检测和人脸框图像的本地保存;
(2)批量读取文件并保存人脸关键点和标签至txt文件。
代码上传至:http://download.csdn.net/download/u012617944/10051117

猜你喜欢

转载自blog.csdn.net/u012617944/article/details/78318422