DetectionClient.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "DetectionClient.hh"
  2. #include <sstream>
  3. #include <tinyxml2.h>
  4. #include <stdexcept>
  5. #include "ZMQClient.hh"
  6. #include <chrono>
  7. DetectionClient::DetectionClient() :
  8. ZMQClient()
  9. {}
  10. DetectionClient::~DetectionClient() {
  11. cancel = 1;
  12. }
  13. // Gibt die Polygone aller gefundenen Objekte zurück
  14. // image: Das Bild das nach Objekten durchsucht werden soll
  15. std::vector< std::vector<cv::Point> > *DetectionClient::getContours(cv::Mat image){
  16. cv::Mat segmentImage = cv::Mat::zeros(image.rows,image.cols,CV_8U);
  17. std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
  18. sendStringToServer("array", true);
  19. std::string replyMessage = sendImageToServer(image, false);
  20. std::stringstream sstream(replyMessage);
  21. std::chrono::steady_clock::time_point end= std::chrono::steady_clock::now();
  22. std::cout << "Time get Contour = "
  23. << (static_cast<float>(std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count())/1000.f)
  24. << " sec" << std::endl;
  25. if(!segmentImage.isContinuous()){
  26. segmentImage = segmentImage.clone();
  27. }
  28. sstream.read((char *)segmentImage.data, image.cols * image.rows);
  29. std::vector< std::vector<cv::Point> > *contours = new std::vector< std::vector<cv::Point> >();
  30. double mind, maxd;
  31. // cv::imshow("Test", segmentImage * 10);
  32. cv::minMaxIdx(segmentImage, &mind, &maxd);
  33. unsigned int max = static_cast<unsigned int>(maxd);
  34. // the segments are scanned individually with compare and then added to contours, because findContours looks for non zero segments
  35. for(unsigned int j = 1; j <= max; j++){
  36. std::vector< std::vector<cv::Point> > contour;
  37. cv::Mat singleSegment = cv::Mat::zeros(image.rows, image.cols, CV_8U);
  38. cv::compare(segmentImage, j, singleSegment, cv::CMP_EQ);
  39. cv::findContours(singleSegment, contour, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
  40. if (!contour.empty()) {
  41. contours->push_back(contour[0]);
  42. }
  43. }
  44. return contours;
  45. }
  46. // Gibt das Segemtierte Bild zurück
  47. // image: Das Bild, welches segmentiert werden soll
  48. cv::Mat DetectionClient::getSegmentation(cv::Mat image)
  49. {
  50. cv::Mat segmentImage = cv::Mat::zeros(image.rows,image.cols,CV_8U);
  51. sendStringToServer("array", true);
  52. std::string replyMessage = sendImageToServer(image, false);
  53. std::stringstream sstream(replyMessage);
  54. if(!segmentImage.isContinuous()){
  55. segmentImage = segmentImage.clone();
  56. }
  57. sstream.read((char *)segmentImage.data, image.cols * image.rows);
  58. return segmentImage;
  59. }