lamiastella

main.cpp

May 30th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.68 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 <opencv/cxcore.h>
  9. #include "opencv2/highgui/highgui.hpp"
  10.  
  11. // OpenARK Libraries
  12. #include "PMDCamera.h"
  13. #include "SR300Camera.h"
  14. #include "Webcam.h"
  15. #include "Visualizer.h"
  16. #include "Hand.h"
  17. #include "Plane.h"
  18. #include "Calibration.h"
  19. #include "Util.h"
  20. #include "UDPSender.h"
  21. #include "Object3D.h"
  22. #include "StreamingAverager.h"
  23.  
  24. int main() {
  25.     DepthCamera * camera = nullptr;
  26.     char * camera_name = "pmd";
  27.     clock_t starttime = clock();
  28.     if (camera_name == "pmd") {
  29.         camera = new PMDCamera();
  30.     }
  31.     else if (camera_name == "sr300") {
  32.         camera = new SR300Camera();
  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.        
  64.         camera->removeNoise();
  65.         cv::namedWindow("XYZ Mona", CV_WINDOW_AUTOSIZE);
  66.         cv::Mat xyz = camera->getXYZMap();
  67.         //cout << "channels: " << xyz.channels() << endl;
  68.         //cout << "nrows: " << xyz.rows << endl;
  69.         //cout << "ncols: " << xyz.cols << endl;
  70.         //cv::imshow("XYZ Mona", Visualizer::visualizeXYZMap(camera->getXYZMap()));
  71.         cv::imshow("XYZ Mona", Visualizer::visualizeXYZMap(xyz));
  72.         //cv::resizeWindow("XYZ Mona", 640, 480);
  73.         //cv::waitKey(0);
  74.         if (camera->badInput) {
  75.             continue;
  76.         }
  77.  
  78.         // Classifying objects in the scene
  79.        
  80.         camera->computeClusters(0.02, 500);
  81.         std::vector<cv::Mat> clusters = camera->getClusters();
  82.         std::vector<Object3D> objects;
  83.        
  84.         int handObjectIndex = -1, planeObjectIndex = -1;
  85.         for (int i = 0; i < clusters.size(); i++) {
  86.             Object3D obj = Object3D(clusters[i].clone());
  87.             if (obj.hasHand) {
  88.                 handObjectIndex = i;
  89.             }
  90.  
  91.             if (obj.hasPlane) {
  92.                 planeObjectIndex = i;
  93.             }
  94.             objects.push_back(obj);
  95.  
  96.         }
  97.  
  98.         // Interprate the relationship between the objects
  99.        
  100.         bool clicked = false, paletteFound = false;
  101.         Object3D handObject, planeObject;
  102.         cv::Point paletteCenter(-1. -1);
  103.         cv::Mat mask = cv::Mat::zeros(camera->getXYZMap().rows, camera->getXYZMap().cols, CV_8UC1);
  104.         if (planeObjectIndex != -1 && handObjectIndex != -1) {
  105.             planeObject = objects[planeObjectIndex];
  106.             handObject = objects[handObjectIndex];
  107.            
  108.             clicked = handObject.getHand().touchObject(planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD * 5);
  109.             cv::Mat scene = Visualizer::visualizePlaneRegression(camera->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
  110.             //scene = Visualizer::visualizeHand(scene, handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij);
  111.             if (planeObject.leftEdgeConnected) {
  112.                 Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
  113.                 cv::Moments m = cv::moments(mask, false);
  114.                 paletteCenter = cv::Point (m.m10 / m.m00, m.m01 / m.m00);
  115.                 cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
  116.                 paletteFound = true;
  117.             }
  118.             cv::imshow("Results", scene);
  119.         } else if (handObjectIndex != -1) {
  120.             handObject = objects[handObjectIndex];
  121.             //cv::imshow("Results", Visualizer::visualizeHand(camera->getXYZMap(), handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij));
  122.         } else if (planeObjectIndex != -1) {
  123.             planeObject = objects[planeObjectIndex];
  124.             cv::Mat scene = Visualizer::visualizePlaneRegression(camera->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
  125.             if (planeObject.leftEdgeConnected) {
  126.                 Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
  127.                 cv::Moments m = cv::moments(mask, false);
  128.                 paletteCenter = cv::Point (m.m10 / m.m00, m.m01 / m.m00);
  129.                 cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
  130.                 paletteFound = true;
  131.             }
  132.             cv::imshow("Results", scene);
  133.         }
  134.  
  135.         // Organize the data and send to game engine
  136.        
  137.         std::string handX = "-", handY = "-", handZ = "-";
  138.         std::string paletteX = "-", paletteY = "-", paletteZ = "-";
  139.         std::string clickStatus = "2";
  140.         std::string num_fingers = "0";
  141.         if (handObjectIndex != -1) {
  142.             cv::Vec3f handPos = handAverager.addDataPoint(objects[handObjectIndex].getHand().fingers_xyz[0]);
  143.             //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]};
  144.             float hand_pt[3] = { handPos[0], handPos[1], handPos[2] };
  145.             cv::Mat hand_mat = cv::Mat(3, 1, CV_32FC1, &hand_pt);
  146.             hand_mat = r*hand_mat + t;
  147.             handX = std::to_string(hand_mat.at<float>(0, 0));
  148.             handY = std::to_string(hand_mat.at<float>(1, 0));
  149.             handZ = std::to_string(hand_mat.at<float>(2, 0));
  150.             num_fingers = std::to_string(objects[handObjectIndex].getHand().fingers_xyz.size());
  151.         }
  152.         else {
  153.             handAverager.addEmptyPoint();
  154.         }
  155.         if (paletteFound) {
  156.             cv::Vec3f pt = paleeteAverager.addDataPoint(camera->getXYZMap().at<cv::Vec3f>(paletteCenter.y, paletteCenter.x));
  157.             float palette_pt[3] = { pt[0], pt[1], pt[2] };
  158.             cv::Mat palette_mat = cv::Mat(3, 1, CV_32FC1, &palette_pt);
  159.             palette_mat = r*palette_mat + t;
  160.             paletteX = std::to_string(palette_mat.at<float>(0, 0));
  161.             paletteY = std::to_string(palette_mat.at<float>(1, 0));
  162.             paletteZ = std::to_string(palette_mat.at<float>(2, 0));
  163.         } else {
  164.             paleeteAverager.addEmptyPoint();
  165.         }
  166.         if (clicked) {
  167.             clickStatus = "1";
  168.         }
  169.  
  170.         std::string tempS = "";
  171.         tempS = handX + "%" + handY + "%" + handZ + "%" + paletteX + "%" + paletteY + "%" + paletteZ + "%" + clickStatus + "%" + num_fingers;
  172.         u.send(tempS);
  173.        
  174.        
  175.        
  176.         /**** Start: Write Frames to File ****/
  177.         //std::string filename = "img" + std::to_string(frame) + ".yml";
  178.         //pmd->writeImage(filename);
  179.         //std::cout << filename << std::endl;
  180.         /**** End: Write Frames to File ****/
  181.  
  182.        
  183.  
  184.         /**** Start: Loop Break Condition ****/
  185.         int c = cv::waitKey(1);
  186.         if (c == 'q' || c == 'Q' || c == 27) {
  187.             break;
  188.         }
  189.         /**** End: Loop Break Condition ****/
  190.         frame++;
  191.         cv::destroyAllWindows();
  192.     }
  193.  
  194.     camera->destroyInstance();
  195.     return 0;
  196. }
Add Comment
Please, Sign In to add comment