lamiastella

main.cpp

Jun 9th, 2017
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.38 KB | None | 0 0
  1. // C++ Libraries
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <time.h>
  6.  
  7. // OpenCV Libraries
  8. #include "opencv2/highgui/highgui.hpp"
  9.  
  10. // OpenARK Libraries
  11. #include "PMDCamera.h"
  12. #include "SR300Camera.h"
  13. #include "Webcam.h"
  14. #include "Visualizer.h"
  15. #include "Hand.h"
  16. #include "Plane.h"
  17. #include "Calibration.h"
  18. #include "Util.h"
  19. #include "UDPSender.h"
  20. #include "Object3D.h"
  21. #include "StreamingAverager.h"
  22. #include "global.h"
  23.  
  24. int main() {
  25.     clock_t starttime = clock();
  26.     DepthCamera * camera = nullptr;
  27.     if (camera_name == "pmd") {
  28.         camera = new PMDCamera();
  29.     }
  30.     else if (camera_name == "sr300") {
  31.         camera = new SR300Camera();
  32.     }
  33.  
  34.     //RGBCamera *cam = new Webcam(1);
  35.     int frame = 0;
  36.     //Calibration::XYZToUnity(*pmd, 4, 4, 3);
  37.     cv::FileStorage fs;
  38.     fs.open("RT_Transform.txt", cv::FileStorage::READ);
  39.  
  40.     cv::Mat r, t;
  41.     fs["R"] >> r;
  42.     fs["T"] >> t;
  43.  
  44.     fs.release();
  45.  
  46.     UDPSender u = UDPSender();
  47.     cv::namedWindow("Results", CV_WINDOW_NORMAL);
  48.  
  49.     StreamingAverager handAverager = StreamingAverager(4, 0.1);
  50.     StreamingAverager paleeteAverager = StreamingAverager(6, 0.05);
  51.  
  52.     while (true)
  53.     {
  54.         camera->update();
  55.  
  56.         /**
  57.         std::string filename = "..//OpenARK_Datasets//TwoHandDataSet1//img" + std::to_string(frame) + ".yml";
  58.         if (!pmd->readImage(filename))
  59.         break;
  60.         **/
  61.  
  62.         // Loading image from sensor
  63.         camera->removeNoise();
  64.         if (camera->badInput) {
  65.             cv::waitKey(10);
  66.             continue;
  67.         }
  68.  
  69.         // Classifying objects in the scene
  70.         camera->computeClusters(0.02, 500);
  71.         std::vector<cv::Mat> clusters = camera->getClusters();
  72.         std::vector<Object3D> objects;
  73.         int handObjectIndex = -1, planeObjectIndex = -1;
  74.         for (int i = 0; i < clusters.size(); i++) {
  75.             Object3D obj = Object3D(clusters[i].clone());
  76.             if (obj.hasHand) {
  77.                 handObjectIndex = i;
  78.             }
  79.  
  80.             if (obj.hasPlane) {
  81.                 planeObjectIndex = i;
  82.             }
  83.             objects.push_back(obj);
  84.         }
  85.  
  86.         // Interprate the relationship between the objects
  87.         bool clicked = false, paletteFound = false;
  88.         Object3D handObject, planeObject;
  89.         cv::Point paletteCenter(-1. - 1);
  90.         cv::Mat mask = cv::Mat::zeros(camera->getXYZMap().rows, camera->getXYZMap().cols, CV_8UC1);
  91.         if (planeObjectIndex != -1 && handObjectIndex != -1) {
  92.             planeObject = objects[planeObjectIndex];
  93.             handObject = objects[handObjectIndex];
  94.  
  95.             clicked = handObject.getHand().touchObject(planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD * 5);
  96.             cv::Mat scene = Visualizer::visualizePlaneRegression(camera->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
  97.             //scene = Visualizer::visualizeHand(scene, handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij);
  98.             if (planeObject.leftEdgeConnected) {
  99.                 Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
  100.                 cv::Moments m = cv::moments(mask, false);
  101.                 paletteCenter = cv::Point(m.m10 / m.m00, m.m01 / m.m00);
  102.                 cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
  103.                 paletteFound = true;
  104.             }
  105.             cv::namedWindow("Results", CV_WINDOW_AUTOSIZE);
  106.             cv::imshow("Results", scene);
  107.         }
  108.         else if (handObjectIndex != -1) {
  109.             handObject = objects[handObjectIndex];
  110.             //cv::imshow("Results", Visualizer::visualizeHand(pmd->getXYZMap(), handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij));
  111.         }
  112.         else if (planeObjectIndex != -1) {
  113.             planeObject = objects[planeObjectIndex];
  114.             cv::Mat scene = Visualizer::visualizePlaneRegression(camera->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
  115.             if (planeObject.leftEdgeConnected) {
  116.                 Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
  117.                 cv::Moments m = cv::moments(mask, false);
  118.                 paletteCenter = cv::Point(m.m10 / m.m00, m.m01 / m.m00);
  119.                 cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
  120.                 paletteFound = true;
  121.             }
  122.             cv::namedWindow("Results", CV_WINDOW_AUTOSIZE);
  123.             cv::imshow("Results", scene);
  124.         }
  125.  
  126.         // Organize the data and send to game engine
  127.         std::string handX = "-", handY = "-", handZ = "-";
  128.         std::string paletteX = "-", paletteY = "-", paletteZ = "-";
  129.         std::string clickStatus = "2";
  130.         std::string num_fingers = "0";
  131.         if (handObjectIndex != -1) {
  132.             cv::Vec3f handPos = handAverager.addDataPoint(objects[handObjectIndex].getHand().fingers_xyz[0]);
  133.             //float hand_pt[3] = { objects[handObjectIndex].getHand().pointer_finger_xyz[0], objects[handObjectIndex].getHand().pointer_finger_xyz[1], objects[handObjectIndex].getHand().pointer_finger_xyz[2]};
  134.             float hand_pt[3] = { handPos[0], handPos[1], handPos[2] };
  135.             cv::Mat hand_mat = cv::Mat(3, 1, CV_32FC1, &hand_pt);
  136.             std::cout << "here" << endl;
  137.             hand_mat = r*hand_mat + t;
  138.             std::cout << "also" << endl;
  139.             handX = std::to_string(hand_mat.at<float>(0, 0));
  140.             handY = std::to_string(hand_mat.at<float>(1, 0));
  141.             handZ = std::to_string(hand_mat.at<float>(2, 0));
  142.             num_fingers = std::to_string(objects[handObjectIndex].getHand().fingers_xyz.size());
  143.         }
  144.         else {
  145.             handAverager.addEmptyPoint();
  146.         }
  147.         if (paletteFound) {
  148.             cv::Vec3f pt = paleeteAverager.addDataPoint(camera->getXYZMap().at<cv::Vec3f>(paletteCenter.y, paletteCenter.x));
  149.             float palette_pt[3] = { pt[0], pt[1], pt[2] };
  150.             cv::Mat palette_mat = cv::Mat(3, 1, CV_32FC1, &palette_pt);
  151.             palette_mat = r*palette_mat + t;
  152.             paletteX = std::to_string(palette_mat.at<float>(0, 0));
  153.             paletteY = std::to_string(palette_mat.at<float>(1, 0));
  154.             paletteZ = std::to_string(palette_mat.at<float>(2, 0));
  155.         }
  156.         else {
  157.             paleeteAverager.addEmptyPoint();
  158.         }
  159.         if (clicked) {
  160.             clickStatus = "1";
  161.         }
  162.  
  163.         std::string tempS = "";
  164.         tempS = handX + "%" + handY + "%" + handZ + "%" + paletteX + "%" + paletteY + "%" + paletteZ + "%" + clickStatus + "%" + num_fingers;
  165.         u.send(tempS);
  166.  
  167.  
  168.  
  169.         /**** Start: Write Frames to File ****/
  170.         //std::string filename = "img" + std::to_string(frame) + ".yml";
  171.         //pmd->writeImage(filename);
  172.         //std::cout << filename << std::endl;
  173.         /**** End: Write Frames to File ****/
  174.  
  175.  
  176.  
  177.         /**** Start: Loop Break Condition ****/
  178.         int c = cv::waitKey(1);
  179.         if (c == 'q' || c == 'Q' || c == 27) {
  180.             break;
  181.         }
  182.         /**** End: Loop Break Condition ****/
  183.         frame++;
  184.     }
  185.  
  186.     camera->destroyInstance();
  187.     cv::destroyAllWindows();
  188.     return 0;
  189. }
Add Comment
Please, Sign In to add comment