Esempio n. 1
0
void Jive::update(DepthFrame *frm)
{
   DepthFrame hand;
   vector< vector<cv::Point> > contours;
   vector<Vec4i> hierarchy;
   RNG rng(12345);   
   Mat gray;

   // Create silhouette
   clipBackground(*frm, hand);
   _binaryMat = Mat(hand.size.height, hand.size.width, CV_32FC1, hand.amplitude.data());  
   _binaryMat.convertTo(gray, CV_8U, 255.0);
   threshold(gray, gray, 200, 255, THRESH_BINARY);
   findContours(gray, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0,0));
   Mat drawing = Mat::zeros( gray.size(), CV_8UC3 );

   int hands = 0;
   if (contours.size() > 0) {

      vector<int> hull, rhull;
      vector<int> defect;
      vector<int> tips;
      cv::Point center = cv::Point(0,0);
      float radius = 0;

      for( int i = 0; i < contours.size(); i++ ) {  
         if (contourArea(contours[i]) > adjPix(1000)) {
            hands++;
            findPalmCenter(contours[i], center, radius);
            float palm_depth = depthAt(*frm, center);
            cv::circle(drawing, center, (int)radius, Scalar(0, 0, 255), 1);

            findKeyPoints(contours[i], hull, defect, adjPix(15));
            distillHullPoints(contours[i], hull, rhull, adjPix(10));
            for (int k=0; k < rhull.size(); k++) {
               if (k > 0)
                  cv::line(drawing, contours[i][rhull[k-1]], contours[i][rhull[k]], Scalar(255, 0, 0), 1);
            }
#if 1
            for (int k=0; k < defect.size(); k++) 
               cv::circle(drawing, contours[i][defect[k]], adjPix(3), Scalar(255, 0, 255), -1);
#endif
            vector<int> temp;
            vector<cv::Point> tips;
            kCurvature(contours[i], rhull, adjPix(5), adjPix(25), 60.0, temp);
            for (int k=0; k < temp.size(); k++) {
          //     if (depthAt(*frm, contours[i][temp[k]]) < palm_depth) 
                  tips.push_back(contours[i][temp[k]]);
            }
            for (int k=0; k < tips.size(); k++) {
               cv::circle(drawing, tips[k], adjPix(4), Scalar(0, 0, 255), -1);
            }

#if 0
            cout << "palm_size= " << palm_depth << " ";
            for (int k=0; k < temp.size(); k++) 
               cout << "temp[" << k << "]=" << depthAt(*frm, contours[i][temp[k]]) << " ";
            cout << endl;
#endif
         }
         drawContours( drawing, contours, i, Scalar(0, 255, 0), 1, 8, vector<Vec4i>(), 0, cv::Point() );  
      }
   }

   imshow("Binary", _binaryMat);
   imshow("Contours", drawing);
}
Esempio n. 2
0
const QVector3D AbstractPainter::objAt(const QPointF &windowCoordinates)
{
    return objAt(windowCoordinates, depthAt(windowCoordinates), m_camera->viewProjectionInverted());
}