使用OpenCV怎么實(shí)現(xiàn)一個(gè)人臉檢測(cè)功能?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
樂(lè)清ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
1、HAAR級(jí)聯(lián)檢測(cè)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; #include <iostream> #include <cstdlib> using namespace std; int main(int artc, char** argv) { face_detect_haar(); waitKey(0); return 0; } void face_detect_haar() { CascadeClassifier faceDetector; std::string haar_data_file = "./models/haarcascades/haarcascade_frontalface_alt_tree.xml"; faceDetector.load(haar_data_file); vector<Rect> faces; //VideoCapture capture(0); VideoCapture capture("./video/test.mp4"); Mat frame, gray; int count=0; while (capture.read(frame)) { int64 start = getTickCount(); if (frame.empty()) { break; } // 水平鏡像調(diào)整 // flip(frame, frame, 1); imshow("input", frame); if (frame.channels() == 4) cvtColor(frame, frame, COLOR_BGRA2BGR); cvtColor(frame, gray, COLOR_BGR2GRAY); equalizeHist(gray, gray); faceDetector.detectMultiScale(gray, faces, 1.2, 1, 0, Size(30, 30), Size(400, 400)); for (size_t t = 0; t < faces.size(); t++) { count++; rectangle(frame, faces[t], Scalar(0, 255, 0), 2, 8, 0); } float fps = getTickFrequency() / (getTickCount() - start); ostringstream ss;ss.str(""); ss << "FPS: " << fps << " ; inference time: " << time << " ms"; putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8); imshow("haar_face_detection", frame); if (waitKey(1) >= 0) break; } printf("total face: %d\n", count); }
2、 DNN人臉檢測(cè)
#include <opencv2/dnn.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace cv::dnn; #include <iostream> #include <cstdlib> using namespace std; const size_t inWidth = 300; const size_t inHeight = 300; const double inScaleFactor = 1.0; const Scalar meanVal(104.0, 177.0, 123.0); const float confidenceThreshold = 0.7; void face_detect_dnn(); void mtcnn_demo(); int main(int argc, char** argv) { face_detect_dnn(); waitKey(0); return 0; } void face_detect_dnn() { //這里采用tensorflow模型 std::string modelBinary = "./models/dnn/face_detector/opencv_face_detector_uint8.pb"; std::string modelDesc = "./models/dnn/face_detector/opencv_face_detector.pbtxt"; // 初始化網(wǎng)絡(luò) dnn::Net net = readNetFromTensorflow(modelBinary, modelDesc); net.setPreferableBackend(DNN_BACKEND_OPENCV); net.setPreferableTarget(DNN_TARGET_CPU); if (net.empty()) { printf("Load models fail...\n"); return; } // 打開(kāi)攝像頭 // VideoCapture capture(0); VideoCapture capture("./video/test.mp4"); if (!capture.isOpened()) { printf("Don't find video...\n"); return; } Mat frame; int count=0; while (capture.read(frame)) { int64 start = getTickCount(); if (frame.empty()) { break; } // 水平鏡像調(diào)整 // flip(frame, frame, 1); imshow("input", frame); if (frame.channels() == 4) cvtColor(frame, frame, COLOR_BGRA2BGR); // 輸入數(shù)據(jù)調(diào)整 Mat inputBlob = blobFromImage(frame, inScaleFactor, Size(inWidth, inHeight), meanVal, false, false); net.setInput(inputBlob, "data"); // 人臉檢測(cè) Mat detection = net.forward("detection_out"); vector<double> layersTimings; double freq = getTickFrequency() / 1000; double time = net.getPerfProfile(layersTimings) / freq; Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>()); ostringstream ss; for (int i = 0; i < detectionMat.rows; i++) { // 置信度 0~1之間 float confidence = detectionMat.at<float>(i, 2); if (confidence > confidenceThreshold) { count++; int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols); int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows); int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols); int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows); Rect object((int)xLeftBottom, (int)yLeftBottom, (int)(xRightTop - xLeftBottom), (int)(yRightTop - yLeftBottom)); rectangle(frame, object, Scalar(0, 255, 0)); ss << confidence; std::string conf(ss.str()); std::string label = "Face: " + conf; int baseLine = 0; Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height), Size(labelSize.width, labelSize.height + baseLine)), Scalar(255, 255, 255), FILLED); putText(frame, label, Point(xLeftBottom, yLeftBottom), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0)); } } float fps = getTickFrequency() / (getTickCount() - start); ss.str(""); ss << "FPS: " << fps << " ; inference time: " << time << " ms"; putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8); imshow("dnn_face_detection", frame); if (waitKey(1) >= 0) break; } printf("total face: %d\n", count); }
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。
分享題目:使用OpenCV怎么實(shí)現(xiàn)一個(gè)人臉檢測(cè)功能
鏈接分享:http://www.rwnh.cn/article10/jjssgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、響應(yīng)式網(wǎng)站、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)