๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[C++ ๋กœ OpenCV ๊ตฌํ˜„ํ•˜๊ธฐ] (8) Face Detection ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Image Processing

[C++ ๋กœ OpenCV ๊ตฌํ˜„ํ•˜๊ธฐ] (8) Face Detection

์ง•์ง•์•ŒํŒŒ์นด 2023. 6. 13. 18:37
728x90
๋ฐ˜์‘ํ˜•

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” Murtaza's Workshop ์˜ ์œ ํŠœ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :-)>

=> LEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Vision

 

๐ŸŒ€ Face Detection

๐Ÿ’ง  haarcascade_frontalface_default.xml (์ •๋ฉด ์–ผ๊ตด ๊ฒ€์ถœํ•˜๊ธฐ) ๋‹ค์šด๋ฐ›์•„์„œ Resources/ ์— ๋„ฃ๊ธฐ 

CascadeClassifier.detectMultiScale(image, scaleFactor=None, minNeighbors=None, flags=None, minSize=None, maxSize=None)


image : ์ž…๋ ฅ ์˜์ƒ (cv2.CV_8U)
scaleFactor : ์˜์ƒ ์ถ•์†Œ ๋น„์œจ. ๊ธฐ๋ณธ๊ฐ’์€ 1.1.
minNeighbors : ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ด์›ƒ ์‚ฌ๊ฐํ˜•์ด ๊ฒ€์ถœ๋˜์–ด์•ผ ์ตœ์ข… ๊ฒ€์ถœ ์˜์—ญ์œผ๋กœ ์„ค์ •ํ• ์ง€๋ฅผ ์ง€์ •. ๊ธฐ๋ณธ๊ฐ’์€ 3.
flags : (ํ˜„์žฌ) ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
minSize : ์ตœ์†Œ ๊ฐ์ฒด ํฌ๊ธฐ. (w, h) ํŠœํ”Œ.
maxSize : ์ตœ๋Œ€ ๊ฐ์ฒด ํฌ๊ธฐ. (w, h) ํŠœํ”Œ.
result : ๊ฒ€์ถœ๋œ ๊ฐ์ฒด์˜ ์‚ฌ๊ฐํ˜• ์ •๋ณด(x, y, w, h)๋ฅผ ๋‹ด์Œ

#include <opencv2/opencv.hpp>		// OpenCV์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ
#include <opencv2/videoio.hpp>		// ๋น„๋””์˜ค ์ถ”์  ๋ฐ ๋ฐฐ๊ฒฝ segmentation๊ณผ ๊ด€๋ จ๋œ ๋ฃจํ‹ด
#include <opencv2/imgcodecs.hpp>	// ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์„ ์–ธ (Mat ์ด๋‚˜ Point๊ฐ€ ์„ ์–ธ, ํ–‰๋ ฌ ์—ฐ์‚ฐ ํ˜น์€ ๋ฒกํ„ฐ ์—ฐ์‚ฐ)
#include <opencv2/highgui.hpp>		// ์œˆ๋„์šฐ ํ™”๋ฉด, UI์ฒ˜๋ฆฌ(์Šฌ๋ผ์ด๋”, ๋ฒ„ํŠผ ๋“ฑ) ๋ฐ ๋งˆ์šฐ์Šค ์ œ์–ด ๊ฐ€๋Šฅ
#include <opencv2/objdetect.hpp>
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

// #8. Face Detection
void main() {
	// Mat์€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ด์„ ๊ฐ์ฒด์ด๋‹ค. ํ–‰๋ ฌ ๊ตฌ์„ฑ
	string path = "Resources/jk2.jpg";
	Mat img = imread(path);
	Mat imgResize;

	resize(img, imgResize, Size(300, 300));

	//  ๋ฏธ๋ฆฌ ํ•™์Šต๋˜์–ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ๋‚ด๊ฐ€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต
	CascadeClassifier faceCascade;
	faceCascade.load("Resources/haarcascade_frontalface_default.xml");
	
	if (faceCascade.empty()) {
		cout << "XML file not loaded" << endl;
	}

	vector<Rect> faces;
	// ํŠน์ • ์˜์ƒ์—์„œ ๋‚ด๊ฐ€ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœ
	faceCascade.detectMultiScale(imgResize, faces, 1.1, 10);

	for (int i = 0; i < faces.size(); i++) {
		rectangle(imgResize, faces[i].tl(), faces[i].br(), Scalar(255, 0, 44));
	}

	imshow("img", imgResize);
	waitKey(0);

}

 

728x90
๋ฐ˜์‘ํ˜•
Comments