本人使用環境 工具與庫 ubuntu18.04 opencv4.2.0 cmake 3.10.2
找個地方建工程檔案: mkdir project
project下 mkdir facedetect
facedetect 先mkdir build 再建立CMakeLists.txt facedetect.cpp
使用以下指令将所需要的資源,複制到build底下,請確定目前路徑為在build下:
所需資源為:haarcascade_frontalface_default.xml . (可以通過find 指令去查找這個資源的位置,https://blog.csdn.net/nb_zsy/article/details/104150589,指令不回的搜左邊那個網址)
cp -r /usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml .
這個指令是根據我自己的環境輸的,你們要按自己的路徑來輸指令,需要的資源就是haarcascade_frontalface_default.xml
在build底下 執行 cmake … (隻有兩個點,不知道為啥這裡多顯示一個點)
接着執行 cmake --build ./build/
成功的話你應該看到以下内容(不包括.jpg檔案)
接着向build下添加自己想識别的jpg圖檔,執行build下的facedetect程式 ,人臉将會用綠色的框框标記。
./facedetect zsy_sister.jpg(該圖檔是我自己拍的)
./facedetect harris_and_wife.jpg(該圖檔是網上搜的)
CMakeLists.txt 代碼:
#cmake need this
cmake_minimum_required(VERSION 3.1)
#Enable C++ 11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED)
#define project name
project(detectface)
#find OpenCV
find_package(OpenCV REQUIRED)
#If package found,several variable will be set
message(STATUS "OpenCV libray status: ")
message(STATUS" config: ${OpenCV_DIR}")
message(STATUS" version: ${OpenCV_VERSION}")
message(STATUS" libraries: ${OpenCV_LIBS}")
message(STATUS" include path: ${OpenCV_INCLUDE_DIRS}")
#declare executable target build from sources
add_executable(facedetect facedetect.cpp)
#link to OpenCV lib
target_link_libraries(facedetect ${OpenCV_LIBS})
facedetect.cpp 源碼:
#include "opencv2/opencv.hpp"
int main(int argc, char const *argv[])
{
cv::CascadeClassifier cascade;
std::string imageName, cascadeName;
cv::Mat image, gray;
std::vector<cv::Rect> faces;
cv::Scalar greenColor = cv::Scalar(0,255,0);
cascadeName = "./haarcascade_frontalface_default.xml";
imageName = argv[1];
//load image and class
if(!cascade.load(cascadeName)){
std::cerr << "Could not load classifier cascade" << std::endl;
}else if(imageName.empty()){
std::cout<<"Could not read"<<imageName<<std::endl;
}else{
image = cv::imread(imageName,1);
if (image.empty())
{
std::cout << "Could not imread image" << std::endl;
/* code */
}
}
//convert to gray
cv::cvtColor(image,gray,cv::COLOR_BGR2GRAY);
// run face detector
cascade.detectMultiScale(image,faces,1.1,2,0,cv::Size(30,30));
//output rectange
for(size_t i = 0; i < faces.size(); ++i){
cv::Rect r = faces[i];
cv::rectangle(
image,cv::Point(cvRound(r.x),cvRound(r.y)),
cv::Point(cvRound(r.x+r.width-1),cvRound(r.y+r.height-1)),
greenColor,3,8,0);
}
cv::imshow("result",image);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
感謝YOUTUBE大神的指導,會翻牆的朋友請直接看:
https://www.youtube.com/watch?v=GwHRG-JZZew