You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

SegmentationFreeRecognizer.cpp 3.6 kB

7 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // Created by 庾金科 on 28/11/2017.
  3. //
  4. #include "../include/SegmentationFreeRecognizer.h"
  5. namespace pr {
  6. SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel) {
  7. net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
  8. }
  9. inline int judgeCharRange(int id)
  10. {return id<31 || id>63;
  11. }
  12. std::pair<std::string,float> decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table,float thres)
  13. {
  14. // cv::imshow("imagea",code_table);
  15. // cv::waitKey(0);
  16. cv::MatSize mtsize = code_table.size;
  17. int sequencelength = mtsize[2];
  18. int labellength = mtsize[1];
  19. cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
  20. std::string name = "";
  21. std::vector<int> seq(sequencelength);
  22. std::vector<std::pair<int,float>> seq_decode_res;
  23. for(int i = 0 ; i < sequencelength; i++) {
  24. float *fstart = ((float *) (code_table.data) + i * labellength );
  25. int id = std::max_element(fstart,fstart+labellength) - fstart;
  26. seq[i] =id;
  27. }
  28. float sum_confidence = 0;
  29. int plate_lenghth = 0 ;
  30. for(int i = 0 ; i< sequencelength ; i++)
  31. {
  32. if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
  33. {
  34. float *fstart = ((float *) (code_table.data) + i * labellength );
  35. float confidence = *(fstart+seq[i]);
  36. std::pair<int,float> pair_(seq[i],confidence);
  37. seq_decode_res.push_back(pair_);
  38. //
  39. }
  40. }
  41. int i = 0;
  42. if(judgeCharRange(seq_decode_res[0].first) && judgeCharRange(seq_decode_res[1].first))
  43. {
  44. i=2;
  45. int c = seq_decode_res[0].second<seq_decode_res[1].second;
  46. name+=mapping_table[seq_decode_res[c].first];
  47. sum_confidence+=seq_decode_res[c].second;
  48. plate_lenghth++;
  49. }
  50. for(; i < seq_decode_res.size();i++)
  51. {
  52. name+=mapping_table[seq_decode_res[i].first];
  53. sum_confidence +=seq_decode_res[i].second;
  54. plate_lenghth++;
  55. }
  56. std::pair<std::string,float> res;
  57. res.second = sum_confidence/plate_lenghth;
  58. res.first = name;
  59. return res;
  60. }
  61. std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table)
  62. {
  63. cv::MatSize mtsize = code_table.size;
  64. int sequencelength = mtsize[2];
  65. int labellength = mtsize[1];
  66. cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
  67. std::string name = "";
  68. std::vector<int> seq(sequencelength);
  69. for(int i = 0 ; i < sequencelength; i++) {
  70. float *fstart = ((float *) (code_table.data) + i * labellength );
  71. int id = std::max_element(fstart,fstart+labellength) - fstart;
  72. seq[i] =id;
  73. }
  74. for(int i = 0 ; i< sequencelength ; i++)
  75. {
  76. if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
  77. name+=mapping_table[seq[i]];
  78. }
  79. std::cout<<name;
  80. return name;
  81. }
  82. std::pair<std::string,float> SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image,std::vector<std::string> mapping_table) {
  83. cv::transpose(Image,Image);
  84. cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40,160));
  85. net.setInput(inputBlob, "data");
  86. cv::Mat char_prob_mat = net.forward();
  87. return decodeResults(char_prob_mat,mapping_table,0.00);
  88. }
  89. }