LevelThumbTool.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //
  2. // LevelThumbTool.cpp
  3. // auto_fill_jewel_v3
  4. //
  5. // Created by Red on 2024/12/4.
  6. //
  7. #include "LevelThumbTool.hpp"
  8. #include <iostream>
  9. #include <sstream>
  10. using std::stringstream;
  11. using std::cout;
  12. using std::endl;
  13. void LevelThumbTool::makeThumb(string outpngname, vector<int>& plateIdArr,vector<ContourData::Point>& platePosiArr )
  14. {
  15. int visWid = 640 ;
  16. int visHei = 720 ;
  17. int canvasWid = visWid+270 ;
  18. int canvasHei = visHei+100 ;
  19. int x0 = 20 ;
  20. int y0 = 50 ;
  21. cv::Mat levelimage = cv::Mat::ones( canvasHei, canvasWid , CV_8UC3 );
  22. cv::Point p0(x0 ,y0 ) ;
  23. cv::Point p1(x0+visWid,y0+visHei) ;
  24. cv::rectangle(levelimage, p0, p1, cv::Scalar(191,191,191),2,cv::LINE_8) ;
  25. for(int ip = 0 ; ip < plateIdArr.size(); ++ ip ) {
  26. FillGlobalConfig::PlateItem* plate = FillGlobalConfig::getInstance()->getPlateItemById(plateIdArr[ip]) ;
  27. string pngName = string("./轮廓/sg_盘子轮廓/")+ plate->_pngName ;
  28. cv::Mat png = cv::imread(pngName) ;
  29. int x = platePosiArr[ip].x ;
  30. int y = platePosiArr[ip].y ;
  31. y = 720 - y ; //左下坐标转左上坐标
  32. x+=x0;
  33. y+=y0;
  34. int wid = plate->_bbwid ;
  35. int hei = plate->_bbhei ;
  36. x = x-wid/2 ;
  37. y = y-hei/2 ;
  38. //cout<<x<<","<<y<<","<<wid<<","<<hei <<" canvas " << levelimage.rows <<"," << levelimage.cols <<endl;
  39. png.copyTo( levelimage(cv::Rect(x,y,wid,hei)) ) ;
  40. }
  41. cv::imwrite(outpngname, levelimage) ;
  42. }
  43. void LevelThumbTool::drawthumb(
  44. string outname ,
  45. vector<tuple<int,vector<vector<FillResult>>>>& fillResultsArr,
  46. vector<ContourData::Point>& posiArr ) {
  47. vector<int> plateIdArr ;
  48. for(int ip = 0 ; ip < fillResultsArr.size();++ip ) {
  49. plateIdArr.push_back( std::get<0>(fillResultsArr[ip]) ) ;
  50. }
  51. makeThumb(outname, plateIdArr, posiArr) ;
  52. }
  53. void LevelThumbTool::makeThumb2(string outpngname, vector<tuple<int,vector<vector<FillResult>>>>& fillResultsArr,vector<ContourData::Point>& platePosiArr )
  54. {
  55. int visWid = 640 ;
  56. int visHei = 720 ;
  57. int canvasWid = visWid+270 ;
  58. int canvasHei = visHei+100 ;
  59. int x0 = 20 ;
  60. int y0 = 50 ;
  61. cv::Mat levelimage = cv::Mat::ones( canvasHei, canvasWid , CV_8UC3 );
  62. cv::Point p0(x0 ,y0 ) ;
  63. cv::Point p1(x0+visWid,y0+visHei) ;
  64. cv::rectangle(levelimage, p0, p1, cv::Scalar(191,191,191),2,cv::LINE_8) ;
  65. for(int ip = 0 ; ip < fillResultsArr.size(); ++ ip ) {
  66. int plateTypeId = std::get<0>( fillResultsArr[ip] ) ;
  67. int nlyr = (int) std::get<1>( fillResultsArr[ip] ).size() ;
  68. FillGlobalConfig::PlateItem* plate = FillGlobalConfig::getInstance()->getPlateItemById(plateTypeId) ;
  69. string pngName = string("./轮廓/sg_盘子轮廓/")+ plate->_pngName ;
  70. cv::Mat png = cv::imread(pngName) ;
  71. int x = platePosiArr[ip].x ;
  72. int y = platePosiArr[ip].y ;
  73. y = 720 - y ; //左下坐标转左上坐标
  74. x+=x0;
  75. y+=y0;
  76. int wid = plate->_bbwid ;
  77. int hei = plate->_bbhei ;
  78. x = x-wid/2 ;
  79. y = y-hei/2 ;
  80. //cout<<x<<","<<y<<","<<wid<<","<<hei <<" canvas " << levelimage.rows <<"," << levelimage.cols <<endl;
  81. png.copyTo( levelimage(cv::Rect(x,y,wid,hei)) ) ;
  82. //写入层数
  83. stringstream ss ;
  84. ss<<" x"<<nlyr ;
  85. cv::putText(levelimage, ss.str(), cv::Point(x+5,y+25), cv::FONT_HERSHEY_PLAIN, 1, cv::Scalar(103,101,238)) ;
  86. }
  87. cv::imwrite(outpngname, levelimage) ;
  88. }