chessboard.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <opencv.hpp>
  2. #include <math.h>
  3. #include <io.h>
  4. #include "chessboard.h"
  5. #include "utils.h"
  6. namespace graft_cv {
  7. CChessboard::CChessboard(
  8. ConfigParam& cp,
  9. CGcvLogger*pLog)
  10. :m_cp(cp),
  11. m_pLogger(pLog),
  12. m_dtype(img_type::tea_grab)
  13. {
  14. }
  15. CChessboard::~CChessboard() {};
  16. int CChessboard::detect(
  17. ImgInfo*imginfo,
  18. PositionInfo& posinfo,
  19. int corner_row,
  20. int corner_col,
  21. int x0,
  22. int y0,
  23. int width,
  24. int height,
  25. const char* fn)
  26. {
  27. //1 load data
  28. load_data(imginfo, fn);
  29. //2
  30. if (m_cp.image_show) {
  31. cv::Rect rc = cv::Rect(x0, y0, width, height);
  32. cv::Mat img_tmp = m_raw_img.clone();
  33. cv::rectangle(img_tmp, rc, cv::Scalar(0, 0, 255),3);
  34. imshow_wait("crop", img_tmp);
  35. }
  36. cv::Mat crop_img = m_raw_img(cv::Range(y0, y0 + height),cv::Range(x0, x0 + width));
  37. if (m_cp.image_show) {
  38. imshow_wait("cropped", crop_img);
  39. }
  40. //3
  41. std::vector<cv::Point2f> pointbuf;
  42. bool found = cv::findChessboardCorners(
  43. crop_img,
  44. cv::Size(corner_row, corner_col),
  45. pointbuf);
  46. if (found){
  47. cv::Mat tmp_img = crop_img.clone();
  48. if (m_pLogger) {
  49. stringstream buff;
  50. buff << m_imgId << m_dtype_str << "chessboard corners:\nx\ty\n";
  51. for (auto&p : pointbuf) {
  52. buff << p.x+x0 << ", " << p.y+y0 << "\n";
  53. }
  54. m_pLogger->INFO(buff.str());
  55. }
  56. cv::drawChessboardCorners(tmp_img, cv::Size(17, 18), cv::Mat(pointbuf), found);
  57. if (m_ppImgSaver && *m_ppImgSaver) {
  58. (*m_ppImgSaver)->saveImage(tmp_img, m_imgId + "_rst_0");
  59. }
  60. }
  61. else {
  62. if (m_pLogger) {
  63. stringstream buff;
  64. buff << m_imgId << m_dtype_str << "image, NOT found chessboard corners";
  65. m_pLogger->INFO(buff.str());
  66. }
  67. }
  68. return 0;
  69. }
  70. int CChessboard::load_data(
  71. ImgInfo*imginfo,
  72. const char* fn) {
  73. //数据加载功能实现,并生成imageid,保存原始数据到文件
  74. int rst = 0;
  75. //generate image id
  76. if (m_dtype == img_type::tea_grab) {
  77. m_imgId = getImgId(img_type::tea_grab);
  78. m_dtype_str = string(" tea_grab_chessboard ");
  79. }
  80. else {
  81. m_imgId = getImgId(img_type::tea_cut);
  82. m_dtype_str = string(" tea_cut_chessboard ");
  83. }
  84. if (imginfo) {
  85. if (m_pLogger) {
  86. stringstream buff;
  87. buff << m_imgId << m_dtype_str << "image, width=" << imginfo->width
  88. << "\theight=" << imginfo->height;
  89. m_pLogger->INFO(buff.str());
  90. }
  91. if (!isvalid(imginfo)) {
  92. if (m_pLogger) {
  93. m_pLogger->ERRORINFO(m_imgId + m_dtype_str + "input image invalid.");
  94. }
  95. throw_msg(m_imgId + " invalid input image");
  96. }
  97. m_raw_img = imginfo2mat(imginfo);
  98. }
  99. else {
  100. cv::Mat img = imread(fn, cv::IMREAD_COLOR);
  101. if (img.empty()) {
  102. if (m_pLogger) {
  103. m_pLogger->ERRORINFO(m_imgId + m_dtype_str + "input image invalid:" + string(fn));
  104. }
  105. throw_msg(m_imgId + m_dtype_str + "invalid input image: " + string(fn));
  106. }
  107. if (m_pLogger) {
  108. stringstream buff;
  109. buff << m_imgId << m_dtype_str << "image, width=" << img.cols
  110. << "\theight=" << img.rows;
  111. m_pLogger->INFO(buff.str());
  112. }
  113. m_raw_img = img.clone();
  114. }
  115. //image saver
  116. if (m_ppImgSaver && *m_ppImgSaver) {
  117. (*m_ppImgSaver)->saveImage(m_raw_img, m_imgId);
  118. }
  119. return rst;
  120. }
  121. }