2014-04-18 10 views
6

Hallo Ich versuche eine C++ - Datei von dieser Website zu kompilieren: http://opencv-code.com/tutorials/eye-detection-and-tracking/ für Eye-Tracking. Aber ich bin ein bisschen neu und ich verstehe nicht wirklich, wie Bibliotheken miteinander verbunden sind. Ich weiß, dass der absolute Pfad zu den Include-Headern in/user/include/opencv2 liegt. Wie kann ich es in einer GCC-Befehlszeile (Ubuntu) verknüpfen? Ich habe versucht, diesen Befehl ein:Verknüpfung von opencv-Bibliotheken mit g ++

$ g++ -Wall eye-tracking.cpp -o eyeTracking 

Es scheint, ich muss auch andere Bibliotheken verknüpfen. Ich habe versucht, die mit diesem Befehl gefunden Verknüpfung:

$ pkg-config --libs opencv 

Aber auch hier habe ich keine Ahnung, wie die Ausgabe auf meinen Befehl zu verknüpfen. Ich habe versucht, mit meiner Logik, indem Sie die folgenden Befehle eingeben:

$g++ -Wall eye-tracking.cpp -I `pkg-config --libs opencv` -o eyeTracking 

Natürlich ist es nicht funktioniert, ich verstehe nicht wirklich, was ich tue: P

Kann mir jemand erklären, wie?

Hier finden Sie die gesamte Datei Code:

/** 
* eye-tracking.cpp: 
* Eye detection and tracking with OpenCV 
* 
* This program tries to detect and tracking the user's eye with webcam. 
* At startup, the program performs face detection followed by eye detection 
* using OpenCV's built-in Haar cascade classifier. If the user's eye detected 
* successfully, an eye template is extracted. This template will be used in 
* the subsequent template matching for tracking the eye. 
*/ 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/objdetect/objdetect.hpp> 

cv::CascadeClassifier face_cascade; 
cv::CascadeClassifier eye_cascade; 

/** 
* Function to detect human face and the eyes from an image. 
* 
* @param im The source image 
* @param tpl Will be filled with the eye template, if detection success. 
* @param rect Will be filled with the bounding box of the eye 
* @return zero=failed, nonzero=success 
*/ 
int detectEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) 
{ 
std::vector<cv::Rect> faces, eyes; 
face_cascade.detectMultiScale(im, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30,30)); 

for (int i = 0; i < faces.size(); i++) 
{ 
cv::Mat face = im(faces[i]); 
eye_cascade.detectMultiScale(face, eyes, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(20,20)); 

if (eyes.size()) 
{ 
rect = eyes[0] + cv::Point(faces[i].x, faces[i].y); 
tpl = im(rect); 
} 
} 

return eyes.size(); 
} 

/** 
* Perform template matching to search the user's eye in the given image. 
* 
* @param im The source image 
* @param tpl The eye template 
* @param rect The eye bounding box, will be updated with the new location of the eye 
*/ 
void trackEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) 
{ 
cv::Size size(rect.width * 2, rect.height * 2); 
cv::Rect window(rect + size - cv::Point(size.width/2, size.height/2)); 

window &= cv::Rect(0, 0, im.cols, im.rows); 

cv::Mat dst(window.width - tpl.rows + 1, window.height - tpl.cols + 1, CV_32FC1); 
cv::matchTemplate(im(window), tpl, dst, CV_TM_SQDIFF_NORMED); 

double minval, maxval; 
cv::Point minloc, maxloc; 
cv::minMaxLoc(dst, &minval, &maxval, &minloc, &maxloc); 

if (minval <= 0.2) 
{ 
rect.x = window.x + minloc.x; 
rect.y = window.y + minloc.y; 
} 
else 
rect.x = rect.y = rect.width = rect.height = 0; 
} 

int main(int argc, char** argv) 
{ 
// Load the cascade classifiers 
// Make sure you point the XML files to the right path, or 
// just copy the files from [OPENCV_DIR]/data/haarcascades directory 
face_cascade.load("haarcascade_frontalface_alt2.xml"); 
eye_cascade.load("haarcascade_eye.xml"); 

// Open webcam 
cv::VideoCapture cap(0); 

// Check if everything is ok 
if (face_cascade.empty() || eye_cascade.empty() || !cap.isOpened()) 
return 1; 

// Set video to 320x240 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240); 

cv::Mat frame, eye_tpl; 
cv::Rect eye_bb; 

while (cv::waitKey(15) != 'q') 
{ 
cap >> frame; 
if (frame.empty()) 
break; 

// Flip the frame horizontally, Windows users might need this 
cv::flip(frame, frame, 1); 

// Convert to grayscale and 
// adjust the image contrast using histogram equalization 
cv::Mat gray; 
cv::cvtColor(frame, gray, CV_BGR2GRAY); 

if (eye_bb.width == 0 && eye_bb.height == 0) 
{ 
// Detection stage 
// Try to detect the face and the eye of the user 
detectEye(gray, eye_tpl, eye_bb); 
} 
else 
{ 
// Tracking stage with template matching 
trackEye(gray, eye_tpl, eye_bb); 

// Draw bounding rectangle for the eye 
cv::rectangle(frame, eye_bb, CV_RGB(0,255,0)); 
} 

// Display video 
cv::imshow("video", frame); 
} 

return 0; 
} 
+0

Ok, es scheint, dass g ++ mich nicht braucht, um das Argument '-l' vor den Befehl 'pkg-config --libs opencv' zu setzen. Kompilierung funktioniert. – kaligne

Antwort

17

Wenn Sie am Ausgang des pkg-config --libs --cflags opencv aussehen werden Sie sehen, dass es den Link einrichtet und umfassen Linien für Sie. Sie müssen die -l oder -I nicht setzen.

pkg-config --libs <library> gibt die Verknüpfungsargumente für Bibliothek aus.

pkg-config --cflags <library> gibt die Include-Argumente und alle anderen benötigten Compile-Flags aus.