title: linking opencv libraries with g++
body: <p>Hello I am trying to compile a c++ file taken from this website: <a href="http://opencv-code.com/tutorials/eye-detection-and-tracking/" rel="noreferrer">http://opencv-code.com/tutorials/eye-detection-and-tracking/</a>  for eye-tracking.
  But I am kinda new to this and I don't really understand how libraries are linked.
  I know the absolute path to the include headers is located in /user/include/opencv2.
  How can I link it in a gcc command line (ubuntu)?
  I tried this command:</p>
  
  <pre><code>$ g++ -Wall eye-tracking.cpp -o eyeTracking
  </code></pre>
  
  <p>It seems I also need to link other libraries. I tried linking those found with this command:</p>
  
  <pre><code>$ pkg-config --libs opencv
  </code></pre>
  
  <p>But here again I have no clue how to link the output to my command.
  I tried with my logic by entering the following commands:</p>
  
  <pre><code>$g++ -Wall eye-tracking.cpp -I `pkg-config --libs opencv` -o eyeTracking
  </code></pre>
  
  <p>Of course it doesn't work, I don't really understand what I am doing :P</p>
  
  <p>Can someone explain to me how?</p>
  
  <p>Here you will find the whole file code:</p>
  
  <pre><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 &lt;opencv2/imgproc/imgproc.hpp&gt;
  #include &lt;opencv2/highgui/highgui.hpp&gt;
  #include &lt;opencv2/objdetect/objdetect.hpp&gt;
  
  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&amp; im, cv::Mat&amp; tpl, cv::Rect&amp; rect)
  {
  std::vector&lt;cv::Rect&gt; faces, eyes;
  face_cascade.detectMultiScale(im, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30,30));
  
  for (int i = 0; i &lt; 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&amp; im, cv::Mat&amp; tpl, cv::Rect&amp; rect)
  {
  cv::Size size(rect.width * 2, rect.height * 2);
  cv::Rect window(rect + size - cv::Point(size.width/2, size.height/2));
  
  window &amp;= 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, &amp;minval, &amp;maxval, &amp;minloc, &amp;maxloc);
  
  if (minval &lt;= 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 &gt;&gt; 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 &amp;&amp; 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;
  }
  </code></pre>