天天看點

(OpenCV 人臉識别源碼)LINUX下調用opencv簡單識别人臉 親身操作成功 并附上源碼 C++

本人使用環境 工具與庫 ubuntu18.04 opencv4.2.0 cmake 3.10.2

找個地方建工程檔案: mkdir project
project下 mkdir facedetect
facedetect 先mkdir build 再建立CMakeLists.txt facedetect.cpp
(OpenCV 人臉識别源碼)LINUX下調用opencv簡單識别人臉 親身操作成功 并附上源碼 C++
使用以下指令将所需要的資源,複制到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檔案)
(OpenCV 人臉識别源碼)LINUX下調用opencv簡單識别人臉 親身操作成功 并附上源碼 C++
接着向build下添加自己想識别的jpg圖檔,執行build下的facedetect程式 ,人臉将會用綠色的框框标記。

./facedetect zsy_sister.jpg(該圖檔是我自己拍的)

(OpenCV 人臉識别源碼)LINUX下調用opencv簡單識别人臉 親身操作成功 并附上源碼 C++

./facedetect harris_and_wife.jpg(該圖檔是網上搜的)

(OpenCV 人臉識别源碼)LINUX下調用opencv簡單識别人臉 親身操作成功 并附上源碼 C++

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

繼續閱讀