ภาพรวม
หลังจากตรวจจับตาแล้ว การติดตามตำแหน่ง (Tracking) ทำได้ง่ายโดยการ บันทึกพิกัดศูนย์กลางของวงกลม ที่วาดล้อมรอบตา
แนวคิด
- ใช้ตัวแปร
x_axisและy_axisเก็บพิกัด - หลังวาดวงกลมล้อมตา ให้คัดลอกพิกัดศูนย์กลาง (
center.x,center.y) ไปเก็บในตัวแปรเหล่านี้ - แสดงผลพิกัดทาง Console ด้วย
cout
โค้ดตัวอย่าง 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, y_axis; // ตัวแปรเก็บพิกัด
Mat frame;
namedWindow("Detect");
VideoCapture image(0);
if (!image.isOpened()) {
cout << "Couldn't load video from source." << endl;
system("pause");
return 0;
}
image.set(CAP_PROP_FRAME_HEIGHT, 480);
image.set(CAP_PROP_FRAME_WIDTH, 640);
CascadeClassifier face_cascade, eyes_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");
eyes_cascade.load("haarcascade_eye.xml");
while (true) {
bool temp = image.read(frame);
vector<Rect> faces;
face_cascade.detectMultiScale(frame, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(100,100));
for (int i = 0; i < faces.size(); i++) {
Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);
ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255,0,255), 4);
Mat faceROI = frame(faces[i]);
vector<Rect> eyes;
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(5,5));
for (size_t j = 0; j < eyes.size(); j++) {
Point eyeCenter(faces[i].x + eyes[j].x + eyes[j].width*0.5,
faces[i].y + eyes[j].y + eyes[j].height*0.5);
int radius = cvRound((eyes[j].width + eyes[j].height) * 0.25);
circle(frame, eyeCenter, radius, Scalar(255,0,0), 4);
// บันทึกและแสดงพิกัดตา
x_axis = eyes[j].x;
y_axis = eyes[j].y;
cout << "Position of the eyes is: (" << x_axis << "," << y_axis << ")" << endl;
}
}
imshow("Detect", frame);
if (waitKey(30) == 27) break;
}
return 0;
}
ผลลัพธ์
แสดงหน้าต่างวิดีโอพร้อมวงกลมล้อมตา และพิมพ์พิกัดตาใน Console ทุกเฟรม

