Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ का उपयोग कर ओपनसीवी में अभी भी तस्वीर में चेहरे का पता कैसे लगाएं?

हम छवि से चेहरों का पता लगाते हैं। चेहरे का पता लगाने के लिए हमने 'डिटेक्टमल्टीस्केल ()' फंक्शन का इस्तेमाल किया।

इस फ़ंक्शन का वास्तविक स्वरूप है -

सिंटैक्स

detectMultiScale(source matrix, vector, searchScaleFactor, minNeighbours, flags, minfeatureSize)

फ़ंक्शन तर्कों को बदलकर, हम 'डिटेक्ट.मल्टीस्पेस ()' फ़ंक्शन को नियंत्रित कर सकते हैं। यह फ़ंक्शन निम्नलिखित तर्क लेता है।

स्रोत मैट्रिक्स

यह वह मैट्रिक्स है जहां चेहरे का पता लगाया जाएगा। इस मामले में, यह मैट्रिक्स होगा जो वीडियो फ्रेम रख रहा है।

वेक्टर

'डिटेक्ट.मल्टीस्केल ()' फ़ंक्शन आयताकार प्रकार का एक वेक्टर होगा। ओपनसीवी में एक आयत एक वेक्टर है, और हमें इसे एक वेक्टर के रूप में परिभाषित करना होगा।

SearchScaleFactor

सर्च स्केल फैक्टर यह निर्धारित करता है कि फ़ंक्शन कितने अलग-अलग आकार के चेहरों की तलाश करेगा। हम आमतौर पर 1.1 का उपयोग करते हैं। यदि आवश्यक हो, तो हम डिटेक्शन सिस्टम को तेज़ बनाने के लिए 1.2 का उपयोग कर सकते हैं। हालांकि, इस मामले में, चेहरों का उतनी बार पता नहीं चलता जितना कि 1.1 का उपयोग करते समय होता है।

मिन नेबर्स

यह पैरामीटर डिटेक्टर के कॉन्फिडेंस लेवल का पता लगाता है। इसका मतलब है कि यह फ़ंक्शन दिखाता है कि डिटेक्टर कितना आश्वस्त है कि उसने एक चेहरे का पता लगाया है। बेहतर विश्वसनीयता के लिए, हम अधिक संख्या का उपयोग कर सकते हैं, लेकिन यह प्रक्रिया को धीमा कर देगा। तेज़ प्रक्रिया के लिए लेकिन कम विश्वसनीयता के लिए, हम छोटी संख्या का उपयोग कर सकते हैं। हम आमतौर पर 3 या 4 का उपयोग minNeighbours के रूप में करते हैं।

झंडे

डिफ़ॉल्ट रूप से, फ़ंक्शन सभी चेहरों को खोजेगा। यदि हम 'CASCADE_FIND_BIGGEST_OBJECT' को ध्वज के मान के रूप में उपयोग करते हैं, तो यह केवल सबसे बड़े चेहरे की तलाश करेगा। इस मामले में, सिस्टम तेजी से काम करता है। 'CASCADE_SCALE_IMAGE' का उपयोग करके, हम अनेक चेहरों को खोज सकते हैं।

minFeatureSize

minFeatureSize चेहरे का न्यूनतम आकार निर्धारित करता है। यदि हम कैमरे से दूर स्थित चेहरों का पता लगाना चाहते हैं, तो हमें छोटे मान का उपयोग करना चाहिए। अगर चेहरे कैमरे के करीब हैं, तो हमें बड़े मूल्य का उपयोग करना चाहिए। हम सामान्य दूरी के लिए (20 x 20) या (30 x 30) आकार का उपयोग करते हैं। उदाहरण में, हमने डिटेक्टमल्टीस्केल () फ़ंक्शन को

. के रूप में उपयोग किया है
faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//

निम्न कोड दर्शाता है कि OpenCV में स्थिर चित्र से मानवीय चेहरों का पता कैसे लगाया जाता है।

उदाहरण

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
//This header includes definition of 'rectangle()' function//
#include<opencv2/objdetect/objdetect.hpp>
//This header includes the definition of Cascade Classifier//
#include<string>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
   Mat image_with_humanface;//Declaring a matrix to load image with human faces//
   image_with_humanface = imread("friends.jpg");//loading an image that contains human face in it//
   namedWindow("Face Detection");//Declaring a window to show the result//
   string trained_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//Defining the location our XML Trained Classifier in a string//
   CascadeClassifier faceDetector;//Declaring an object named 'face detector' of CascadeClassifier class//
   faceDetector.load(trained_classifier_location);//loading the XML trained classifier in the object//
   vector<Rect>faces;//Declaring a rectangular vector named faces//
   vector<Rect>boundary;//Declaring a rectangular vector named rectangle//
   faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//Detecting the faces in 'image_with_humanfaces' matrix//
   for (size_t i = 0; i < faces.size(); i++){ //Loop to draw rectangle around the faces//
      Mat faceROI = image_with_humanface(faces[i]);//Storing the face in a matrix//
      int x = faces[i].x;//Getting the initial row value of face rectangle's starting point//
      int y = faces[i].y;//Getting the initial column value of face rectangle's starting point//
      int h = y + faces[i].height;//Calculating the height of the rectangle//
      int w = x + faces[i].width;//Calculating the width of the rectangle//
      rectangle(image_with_humanface, Point(x, y), Point(w, h), Scalar(255, 0, 255), 2, 8, 0);//Drawing a rectangle using around the faces//
   }
   imshow("Face Detection", image_with_humanface);//Showing the detected face//
   waitKey(0);//To wait for keystroke to terminate the program//
   return 0;
}

आउटपुट

सी ++ का उपयोग कर ओपनसीवी में अभी भी तस्वीर में चेहरे का पता कैसे लगाएं?


  1. सी ++ का उपयोग कर ओपनसीवी में अंडाकार कैसे आकर्षित करें?

    एक दीर्घवृत्त खींचने के लिए, हमें एक केंद्र, दीर्घ अक्ष और लघु अक्ष की आवश्यकता होती है। इसका मतलब है कि हमें अंडाकार के लिए तीन पैरामीटर चाहिए। हमें एक मैट्रिक्स की आवश्यकता है जहां हम दीर्घवृत्त खींचेंगे, और हमें रेखा की मोटाई और रेखा का रंग घोषित करने की आवश्यकता है। जब हम OpenCV का उपयोग करके ए

  1. C++ का उपयोग करके OpenCV में एक रेखा कैसे खींचना है?

    एक रेखा खींचने के लिए हमें दो बिंदुओं की आवश्यकता होती है-आरंभिक बिंदु और अंत बिंदु। रेखा खींचने के लिए हमें कैनवास की भी आवश्यकता होती है। ओपनसीवी, हमारे कैनवास में मैट्रिक्स का उपयोग करके, हमें लाइन के शुरुआती और समाप्ति बिंदुओं को परिभाषित करने की आवश्यकता है। हमें रेखा को भी एक रंग निर्दिष्ट कर

  1. सी ++ का उपयोग कर ओपनसीवी में किसी छवि के चैनलों की संख्या की गणना कैसे करें?

    इस विषय में, हम समझेंगे कि किसी छवि के चैनलों की संख्या का पता कैसे लगाया जाए। प्रोग्राम चलाने के बाद, कंसोल विंडो में चैनल का नंबर दिखाया जाएगा। चैनल की संख्या प्राप्त करने के लिए, हमने ओपनसीवी के एक वर्ग का उपयोग किया है जिसका नाम चैनल () है। जब हम इमेज मैट्रिक्स को चैनल () वर्ग के ऑब्जेक्ट के रू