chart_detection.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <opencv2/core.hpp>
  2. #include <opencv2/highgui.hpp>
  3. #include <opencv2/mcc.hpp>
  4. #include <iostream>
  5. using namespace std;
  6. using namespace cv;
  7. using namespace mcc;
  8. const char *about = "Basic chart detection";
  9. const char *keys = {
  10. "{ help h usage ? | | show this message }"
  11. "{t | | chartType: 0-Standard, 1-DigitalSG, 2-Vinyl }"
  12. "{v | | Input from video file, if ommited, input comes from camera }"
  13. "{ci | 0 | Camera id if input doesnt come from video (-v) }"
  14. "{nc | 1 | Maximum number of charts in the image }"};
  15. int main(int argc, char *argv[])
  16. {
  17. // ----------------------------------------------------------
  18. // Scroll down a bit (~40 lines) to find actual relevant code
  19. // ----------------------------------------------------------
  20. CommandLineParser parser(argc, argv, keys);
  21. parser.about(about);
  22. int t = parser.get<int>("t");
  23. CV_Assert(0 <= t && t <= 2);
  24. TYPECHART chartType = TYPECHART(t);
  25. int camId = parser.get<int>("ci");
  26. int nc = parser.get<int>("nc");
  27. String video;
  28. if (parser.has("v"))
  29. video = parser.get<String>("v");
  30. if (!parser.check())
  31. {
  32. parser.printErrors();
  33. return 0;
  34. }
  35. VideoCapture inputVideo;
  36. int waitTime;
  37. if (!video.empty())
  38. {
  39. inputVideo.open(video);
  40. waitTime = 10;
  41. }
  42. else
  43. {
  44. inputVideo.open(camId);
  45. waitTime = 10;
  46. }
  47. //--------------------------------------------------------------------------
  48. //-------------------------Actual Relevant Code-----------------------------
  49. //--------------------------------------------------------------------------
  50. while (inputVideo.grab())
  51. {
  52. Mat image, imageCopy;
  53. inputVideo.retrieve(image);
  54. imageCopy = image.clone();
  55. Ptr<CCheckerDetector> detector = CCheckerDetector::create();
  56. // Marker type to detect
  57. if (!detector->process(image, chartType, nc))
  58. {
  59. printf("ChartColor not detected \n");
  60. }
  61. else
  62. {
  63. // get checker
  64. std::vector<Ptr<mcc::CChecker>> checkers = detector->getListColorChecker();
  65. for (Ptr<mcc::CChecker> checker : checkers)
  66. {
  67. // current checker
  68. Ptr<CCheckerDraw> cdraw = CCheckerDraw::create(checker);
  69. cdraw->draw(image);
  70. }
  71. }
  72. imshow("image result | q or esc to quit", image);
  73. imshow("original", imageCopy);
  74. char key = (char)waitKey(waitTime);
  75. if (key == 27)
  76. break;
  77. }
  78. return 0;
  79. }