1. 程式人生 > >深度學習系列之(dlib+opencv)程式碼收藏

深度學習系列之(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如何傳入

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.例項程式碼收藏

7.vs2013 dlib opencv應用無法正常啟動0xc00007b

重新配置了opencv:路徑加入環境變數(之前一直偷懶沒加,這次就報了這個錯),檢查專案中的opencv配置。