cascade_detect_sequence.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*M///////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
  4. //
  5. // By downloading, copying, installing or using the software you agree to this license.
  6. // If you do not agree to this license, do not download, install,
  7. // copy or use the software.
  8. //
  9. //
  10. // License Agreement
  11. // For Open Source Computer Vision Library
  12. //
  13. // Copyright (C) 2015, Itseez Inc, all rights reserved.
  14. // Third party copyrights are property of their respective owners.
  15. //
  16. // Redistribution and use in source and binary forms, with or without modification,
  17. // are permitted provided that the following conditions are met:
  18. //
  19. // * Redistribution's of source code must retain the above copyright notice,
  20. // this list of conditions and the following disclaimer.
  21. //
  22. // * Redistribution's in binary form must reproduce the above copyright notice,
  23. // this list of conditions and the following disclaimer in the documentation
  24. // and/or other materials provided with the distribution.
  25. //
  26. // * The name of the copyright holders may not be used to endorse or promote products
  27. // derived from this software without specific prior written permission.
  28. //
  29. // This software is provided by the copyright holders and contributors "as is" and
  30. // any express or implied warranties, including, but not limited to, the implied
  31. // warranties of merchantability and fitness for a particular purpose are disclaimed.
  32. // In no event shall the Itseez Inc or contributors be liable for any direct,
  33. // indirect, incidental, special, exemplary, or consequential damages
  34. // (including, but not limited to, procurement of substitute goods or services;
  35. // loss of use, data, or profits; or business interruption) however caused
  36. // and on any theory of liability, whether in contract, strict liability,
  37. // or tort (including negligence or otherwise) arising in any way out of
  38. // the use of this software, even if advised of the possibility of such damage.
  39. //
  40. // Author: Jiaolong Xu <jiaolongxu AT gmail.com>
  41. //M*/
  42. #include <opencv2/dpm.hpp>
  43. #include <opencv2/core.hpp>
  44. #include <opencv2/imgproc.hpp>
  45. #include <opencv2/highgui.hpp>
  46. #include <stdio.h>
  47. #include <iostream>
  48. #include <fstream>
  49. using namespace cv;
  50. using namespace cv::dpm;
  51. using namespace std;
  52. int save_results(const string id, const vector<DPMDetector::ObjectDetection> ds, ofstream &out);
  53. static void help()
  54. {
  55. cout << "\nThis example shows object detection on image sequences using \"Deformable Part-based Model (DPM) cascade detection API\n"
  56. "Call:\n"
  57. "./example_dpm_cascade_detect_sequence <model_path> <image_dir>\n"
  58. "The image names has to be provided in \"files.txt\" under <image_dir>.\n"
  59. << endl;
  60. }
  61. static bool readImageLists( const string &file, vector<string> &imgFileList)
  62. {
  63. ifstream in(file.c_str(), ios::binary);
  64. if (in.is_open())
  65. {
  66. while (in)
  67. {
  68. string line;
  69. getline(in, line);
  70. imgFileList.push_back(line);
  71. }
  72. return true;
  73. }
  74. else
  75. {
  76. cerr << "Invalid image index file: " << file << endl;
  77. return false;
  78. }
  79. }
  80. void drawBoxes(Mat &frame,
  81. vector<DPMDetector::ObjectDetection> ds,
  82. Scalar color,
  83. string text);
  84. int main( int argc, char** argv )
  85. {
  86. const char* keys =
  87. {
  88. "{@model_path | | Path of the DPM cascade model}"
  89. "{@image_dir | | Directory of the images }"
  90. };
  91. CommandLineParser parser(argc, argv, keys);
  92. string model_path(parser.get<string>(0));
  93. string image_dir(parser.get<string>(1));
  94. string image_list = image_dir + "/files.txt";
  95. if( model_path.empty() || image_dir.empty() )
  96. {
  97. help();
  98. return -1;
  99. }
  100. vector<string> imgFileList;
  101. if ( !readImageLists(image_list, imgFileList) )
  102. return -1;
  103. cv::Ptr<DPMDetector> detector = \
  104. DPMDetector::create(vector<string>(1, model_path));
  105. namedWindow("DPM Cascade Detection", 1);
  106. // the color of the rectangle
  107. Scalar color(0, 255, 255); // yellow
  108. Mat frame;
  109. for (size_t i = 0; i < imgFileList.size(); i++)
  110. {
  111. double t = (double) getTickCount();
  112. vector<DPMDetector::ObjectDetection> ds;
  113. Mat image = imread(image_dir + "/" + imgFileList[i]);
  114. frame = image.clone();
  115. if (image.empty()) {
  116. cerr << "\nInvalid image:\n" << imgFileList[i] << endl;
  117. return -1;
  118. }
  119. // detection
  120. detector->detect(image, ds);
  121. // compute frame per second (fps)
  122. t = ((double) getTickCount() - t)/getTickFrequency();//elapsed time
  123. // draw boxes
  124. string text = format("%0.1f fps", 1.0/t);
  125. drawBoxes(frame, ds, color, text);
  126. // show detections
  127. imshow("DPM Cascade Detection", frame);
  128. if ( waitKey(30) >= 0)
  129. break;
  130. }
  131. return 0;
  132. }
  133. void drawBoxes(Mat &frame, \
  134. vector<DPMDetector::ObjectDetection> ds, Scalar color, string text)
  135. {
  136. for (unsigned int i = 0; i < ds.size(); i++)
  137. {
  138. rectangle(frame, ds[i].rect, color, 2);
  139. }
  140. // draw text on image
  141. Scalar textColor(0,0,250);
  142. putText(frame, text, Point(10,50), FONT_HERSHEY_PLAIN, 2, textColor, 2);
  143. }