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); }
const QVector3D AbstractPainter::objAt(const QPointF &windowCoordinates) { return objAt(windowCoordinates, depthAt(windowCoordinates), m_camera->viewProjectionInverted()); }