الأربعاء، 27 يناير 2021

كود برنامج OpenCV لاكتشاف الوجه ( لغة C ++ )

برنامج OpenCV لاكتشاف الوجه ( لغة C ++ )

برنامج OpenCV لاكتشاف الوجه ( لغة C ++ )


 يستخدم هذا البرنامج مكتبة Opencv لإكتشاف الوجوه في بث مباشر من كاميرا الويب أو في ملف فيديو مخزن في الجهاز المحلي. يكتشف هذا البرنامج الوجوه في الوقت الحقيقي ويتتبعها. يستخدم مصنفات XML سابقة التدريب لنفسه. المصنفات المستخدمة في هذا البرنامج لها ملامح وجه مدربة عليها. يمكن استخدام المصنفات المختلفة لاكتشاف الكائنات المختلفة. متطلبات تشغيل البرنامج:

1) يجب تثبيت OpenCV على الجهاز المحلي.

 2) يجب إعطاء مسارات لملفات XML المصنف قبل تنفيذ البرنامج. يمكن العثور على ملفات XML هذه في دليل OpenCV “opencv / data / haarcascades”.

 3) استخدم 0 في capture.open (0) لتشغيل تغذية كاميرا الويب.

 4) من أجل الكشف في فيديو محلي ، وفر المسار إلى الفيديو. (capture.open (“path_to_video”)).

 

التنفيذ:

مرشح

تعديل

play_arrow

سطوع_4

// برنامج CPP لاكتشاف الوجه في الفيديو

// تضمين ملفات الرأس المطلوبة من دليل OpenCV

الكود The Code

#include "/usr/local/include/opencv2/objdetect.hpp"

#include "/usr/local/include/opencv2/highgui.hpp"

#include "/usr/local/include/opencv2/imgproc.hpp"

#include <iostream>

  

using namespace std;

using namespace cv;

  

// Function for Face Detection

void detectAndDraw( Mat& img, CascadeClassifier& cascade, 

                CascadeClassifier& nestedCascade, double scale );

string cascadeName, nestedCascadeName;

  

int main( int argc, const char** argv )

{

    // VideoCapture class for playing video for which faces to be detected

    VideoCapture capture; 

    Mat frame, image;

  


    // PreDefined trained XML classifiers with facial features

    CascadeClassifier cascade, nestedCascade; 

    double scale=1;

  

    // Load classifiers from "opencv/data/haarcascades" directory 

    nestedCascade.load( "../../haarcascade_eye_tree_eyeglasses.xml" ) ;

  

    // Change path before execution 

    cascade.load( "../../haarcascade_frontalcatface.xml" ) ; 

  

    // Start Video..1) 0 for WebCam 2) "Path to Video" for a Local Video

    capture.open(0); 

    if( capture.isOpened() )

    {

        // Capture frames from video and detect faces

        cout << "Face Detection Started...." << endl;

        while(1)

        {

            capture >> frame;

            if( frame.empty() )

                break;

            Mat frame1 = frame.clone();

            detectAndDraw( frame1, cascade, nestedCascade, scale ); 

            char c = (char)waitKey(10);

       

   

            // Press q to exit from window

            if( c == 27 || c == 'q' || c == 'Q'

                break;

        }

    }

    else

        cout<<"Could not Open Camera";

    return 0;

}

  

void detectAndDraw( Mat& img, CascadeClassifier& cascade,

                    CascadeClassifier& nestedCascade,

                    double scale)

{

    vector<Rect> faces, faces2;

    Mat gray, smallImg;

  

    cvtColor( img, gray, COLOR_BGR2GRAY ); // Convert to Gray Scale

    double fx = 1 / scale;

  

    // Resize the Grayscale Image 

    resize( gray, smallImg, Size(), fx, fx, INTER_LINEAR ); 

    equalizeHist( smallImg, smallImg );

  

    // Detect faces of different sizes using cascade classifier 

    cascade.detectMultiScale( smallImg, faces, 1.1, 

                            2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );

  


    // Draw circles around the faces

    for ( size_t i = 0; i < faces.size(); i++ )

    {

        Rect r = faces[i];

        Mat smallImgROI;

        vector<Rect> nestedObjects;

        Point center;

        Scalar color = Scalar(255, 0, 0); // Color for Drawing tool

        int radius;

  

        double aspect_ratio = (double)r.width/r.height;

        if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )

        {

            center.x = cvRound((r.x + r.width*0.5)*scale);

            center.y = cvRound((r.y + r.height*0.5)*scale);

            radius = cvRound((r.width + r.height)*0.25*scale);

            circle( img, center, radius, color, 3, 8, 0 );

        }

        else

            rectangle( img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),

                    cvPoint(cvRound((r.x + r.width-1)*scale), 

                    cvRound((r.y + r.height-1)*scale)), color, 3, 8, 0);

        if( nestedCascade.empty() )

            continue;

        smallImgROI = smallImg( r );

          

        // Detection of eyes int the input image

        nestedCascade.detectMultiScale( smallImgROI, nestedObjects, 1.1, 2,

                                        0|CASCADE_SCALE_IMAGE, Size(30, 30) ); 

          

        // Draw circles around eyes

        for ( size_t j = 0; j < nestedObjects.size(); j++ ) 

        {

            Rect nr = nestedObjects[j];

            center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);

            center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);

            radius = cvRound((nr.width + nr.height)*0.25*scale);

            circle( img, center, radius, color, 3, 8, 0 );

        }

    }

  

    // Show Processed Image with detected faces

    imshow( "Face Detection", img ); 

}

 



***********************


***********************

إذا كنت تحتاج إلى عدد أكبر من الفقرات يتيح لك مولد النص العربى زيادة عدد الفقرات كما تريد. هذا النص هو مثال لنص يمكن أن يستبدل في نفس المساحة, ومن هنا وجب على المصمم أن يضع نصوصا مؤقتة على التصميم ليظهر للعميلً