ที่นี่ เราจะเรียนรู้วิธีติดตามดวงตาใน OpenCV หลังจากสืบหาดวงตาแล้ว การติดตามก็เป็นงานที่ง่ายดายและตรงไปตรงมา เราใช้วงกลมปิดตาที่ตรวจพบ การติดตามศูนย์กลางของวงกลมหมายถึงการติดตามศูนย์กลางของดวงตา ในการติดตามจุดศูนย์กลางของวงกลม เราต้องการตัวแปรจำนวนเต็มสองตัว สิ่งนี้ได้ทำในสองบรรทัดแรก (9 th และ 10 th บรรทัด) ภายในฟังก์ชัน main() ชื่อของตัวแปรจำนวนเต็มคือ 'x_axis' และ 'y_axis'
ในบรรทัดที่ 42 และ 43 ค่าพิกัดแนวนอนและแนวตั้งของจุดศูนย์กลางได้ถูกคัดลอกไปยังตัวแปร 'x_axis' และ 'y_axis' แล้ว และสิ่งเหล่านี้มีจุดศูนย์กลางของวงกลม วันที่ 44 th บรรทัดโดยใช้คำสั่ง 'cout' เราได้แสดงค่าของจุดศูนย์กลาง นี่คือวิธีที่เราสามารถติดตามตำแหน่งของดวงตาได้
รหัสต่อไปนี้เพื่อติดตามตำแหน่งตาใน OpenCV โดยใช้ C++
ตัวอย่าง
#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/objdetect/objdetect.hpp> using namespace cv; using namespace std; int main() { int x_axis;//Declaring integer variables to store co-ordinate values// int y_axis;//Declaring integer variables to store co-ordinate values// Mat frame;//Declaring a matrix to video frame in it// namedWindow("Detect");//Declaring a window to show our work// VideoCapture image(0);//capturing video from default camera// if (!image.isOpened()){ //Error message if video source is not found// cout << "Couldn't load video from the source.Make sure your camera is working properly." << endl; system("pause"); return 0; } double height = image.set(CAP_PROP_FRAME_HEIGHT, 480);//setting up height of each frame// double width = image.set(CAP_PROP_FRAME_WIDTH, 640);//setting up width of each frame// CascadeClassifier face_cascade, eyes_cascade;//declaring a CascadeClassifier object// face_cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");//loading the cascade classifier// eyes_cascade.load("C:/opencv/sources/data/haarcascades/haarcascade_eye.xml"); while (true) { bool temp = image.read(frame);//loading video frames from source to our matrix named frame// std::vector<Rect>faces;//Declaring a vector named faces// face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(100, 100));//detecting the face for (int i = 0; i < faces.size(); i++){ //for locating the face Point center(faces[i].x + faces[i].width * 0.5, faces[i].y + faces[i].height * 0.5);//getting the center of the face// ellipse(frame, center, Size(faces[i].width * 0.5, faces[i].height * 0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);//draw an ellipse on the face// Mat faceROI = frame(faces[i]);//Taking area of the face as Region of Interest for eyes// std::vectoreyes;//declaring a vector named eyes// eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(5, 5));//detect eyes in every face// for (size_t j = 0; j < eyes.size(); j++){ //for locating eyes// Point center(faces[i].x + eyes[j].x + eyes[j].width * 0.5, faces[i].y + eyes[j].y + eyes[j].height * 0.5);//getting the centers of both eyes// int radius = cvRound((eyes[j].width + eyes[j].height) * 0.25);//declaring radius of the eye enclosing circles// circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);//drawing circle around both eyes// x_axis = eyes[j].x;//storing x axis location of eyes in x_axis// y_axis = eyes[j].y;//storing y axis location of eyes in y_axis// cout << "Position of the eyes is:" << "(" << x_axis << "," << y_axis << ")" << endl;//showing co-ordinate values// } } imshow("Detect", frame);//showing result in window named 'Detect'// if (waitKey(30) == 27){ //wait time for each frame is 30 milliseconds// break; } } return 0; }
ผลลัพธ์