【Opencv】 於仕琪 人臉68個特征點分布情況
// 鼻尖 30 // 鼻根 27 // 下巴 8 // 左眼外角 36 // 左眼內角 39 // 右眼外角 45 // 右眼內角 42 // 嘴中心 66 // 嘴左角 48 // 嘴右角 54 // 左臉最外 0 // 右臉最外 16
https://blog.csdn.net/zj360202/article/details/78674700
--------------------------------------------------------------------------
對於一些常用的人臉庫常常會提供對應的人臉框的位置以及人臉的特征點的坐標。雖然往往會有68個特征點的坐標,但是如果是用於人臉對齊,並不需要用到所有的點坐標。所以知道特征點的檢測順序能夠幫助我們很快的找到我們所需要的特定點坐標。
如圖1所示,圖中將68個特征點的檢測順序一次標注了出來。(圖片摘自http://blog.csdn.net/zmdsjtu/article/details/53454071)
當然不是所有的數據庫都提供68個特征點,也有78個點,例如圖2所示。(圖片摘自http://blog.163.com/huai_jing@126/blog/static/1718619832013111525150259/)
對於更加少的特征點的出現順序與前面類似,可以推理出來。例如5個特征點的坐標信息可以判別出來每個坐標對應的是那個部位(左右眼,鼻子,左右嘴角)。
當然不是所有的特征點都會按照這個順序進行變化,但是可以通過簡單的算法將每個點一次顯示出來,從而可以找到我們所需要的點。(python)
def point_xy(s): first = s.find(':') x = s[0:first] y = s[first+1:] return x,y for eachpoint in img_point: [x,y] = point_xy(eachpoint) [x,y] = [float(x),float(y)] cv2.circle(im,(int(x),int(y)),2,(0,0,255),-1) cv2.imshow('img',img) cv2.waitKey(0)
其中 img_point是保存了所有特征點的一個數組。這樣就能夠一步一步的看出每個特征點的順序。
https://blog.csdn.net/u011732139/article/details/56286838?locationNum=4&fps=1
--------------------------------------------------------------
Dlib+opencv實時提取人臉輪廓(windows環境下//Dlib配置入門)
本文主要演示Dlib在windows環境下利用VS配置環境運行成功調用攝像頭的實時人臉特征點提取以及輪廓的描繪。
///////////////////////////////軟件資源////////////////////////////////
Dlib下載鏈接:http://download.csdn.net/detail/zmdsjtu/9614780
//官網鏈接 http://dlib.net
//但最新版的dlib用VS2015會報一個很奇葩的錯誤,故而推薦上面的下載鏈接
人臉庫下載鏈接:http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
//////////////////////////////正文/////////////////////////////////////
下載完Dlib之后解壓。
接着新建一個空項目,把下載的人臉庫(.dat文件解壓壓縮包后)添加到如下的目錄下。
繼而在項目里添加Dlib人臉庫里的dlib\\all\\source.cpp進入項目
//如果不添加會報錯,添加了source.cpp相當於把需要用的東西全引入進來了
接着再添加examples\\webcam_face_pose_ex.cpp進入項目
//這個是我們這次主要測試的提取人臉特征點的重要CPP
接着我們開始配置環境~
首先要配置opencv環境以及加上webcam需要調用的文件的目錄
參考如下鏈接:http://blog.csdn.net/zmdsjtu/article/details/52235056
添加包含目錄:
C:\opencv_310\build\include 這個是opencv的包含目錄
C:\Users\handsome\Desktop\dlib-master 這個是dlib的主目錄
添加庫目錄:
C:\opencv_310\build\x86\vc14\lib 這個是opencv的lib存儲位置
附加依賴項的輸入加上:
opencv_world310.lib opencv_ts310.lib 如果是debug或者其他版本的opencv換掉即可
需要注意的幾點:
1.配置環境時選擇的是X86還是X64以及是Release還是Debug,之后調試的時候也要選擇好
2.人臉庫(也就是那個一百兆的.dat文件)需要放對位置,不然程序沒結果!如果直接打開EXE測試的話直接放到和EXE一個目錄即可。
3.電腦一定要有攝像頭!這里利用的是opencv調用攝像頭
4.程序卡頓是因為detector函數耗時過長,可以考慮壓縮畫質或者換好一點的處理器
5.筆記本親測效果遠不如外置攝像頭
6.這個庫可以商用
接着就可以正常運行程序啦~~~
結果如圖:
最后祝大家編程愉快:)
https://blog.csdn.net/zmdsjtu/article/details/52422847
-----------------------------------------------------------------------------------------------
Dlib提取人臉特征點(68點,opencv畫圖)
主要在官網給的Demo基礎之上用Opencv把特征點描繪出來了。
很早之前寫過一篇配置Dlib環境的博客,現在來稍微梳理下提取特征點的使用方法。
上一篇配置環境博客地址:http://blog.csdn.net/zmdsjtu/article/details/52422847
慣例先放效果圖吧:
動圖如下:
接着就是簡單粗暴的代碼:
//@zmdsjtu@163.com //2016-12-4 //http://blog.csdn.net/zmdsjtu/article/details/53454071 #include <dlib/opencv.h> #include <opencv2/opencv.hpp> #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> using namespace dlib; using namespace std; int main() { try { cv::VideoCapture cap(0); if (!cap.isOpened()) { cerr << "Unable to connect to camera" << endl; return 1; } //image_window win; // Load face detection and pose estimation models. frontal_face_detector detector = get_frontal_face_detector(); shape_predictor pose_model; deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model; // Grab and process frames until the main window is closed by the user. while (cv::waitKey(30) != 27) { // Grab a frame cv::Mat temp; cap >> temp; cv_image<bgr_pixel> cimg(temp); // Detect faces std::vector<rectangle> faces = detector(cimg); // Find the pose of each face. std::vector<full_object_detection> shapes; for (unsigned long i = 0; i < faces.size(); ++i) shapes.push_back(pose_model(cimg, faces[i])); if (!shapes.empty()) { for (int i = 0; i < 68; i++) { circle(temp, cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), 3, cv::Scalar(0, 0, 255), -1); // shapes[0].part(i).x();//68個 } } //Display it all on the screen imshow("Dlib特征點", temp); } } catch (serialization_error& e) { cout << "You need dlib's default face landmarking model file to run this example." << endl; cout << "You can get it from the following URL: " << endl; cout << " http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl; cout << endl << e.what() << endl; } catch (exception& e) { cout << e.what() << endl; } }
來看下上面那段代碼,所有的需要的特征點都存儲在Shapes里。仔細看看下面這行代碼:
circle(temp, cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), 3, cv::Scalar(0, 0, 255), -1);
可以看到shpes[0]代表的是第一個人(可以同時檢測到很多個人),part(i)代表的是第i個特征點,x()和y()是訪問特征點坐標的途徑。
每個特征點的編號如下:
在上述畫圖的基礎上加了如下一行代碼:
putText(temp, to_string(i), cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), CV_FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 0),1,4);
效果圖:
對照着上圖,比如說想獲取鼻尖的坐標,那么橫坐標就是shapes[0].part[30].x(),其余的類似。
在這個的基礎上就可以做很多有意思的事情啦,2333
最后祝大家開發愉快:)
原貼地址:https://blog.csdn.net/zmdsjtu/article/details/53454071