Update SegmentationFreeRecognizer.cpp

master
Jack Yu 7 years ago committed by GitHub
parent 324d388eff
commit 5ba8b1c105
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,5 +1,5 @@
// //
// Created by 庾金科 on 28/11/2017. // Created by Jack Yu on 28/11/2017.
// //
#include "../include/SegmentationFreeRecognizer.h" #include "../include/SegmentationFreeRecognizer.h"
@ -7,28 +7,18 @@ namespace pr {
SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel) { SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel) {
net = cv::dnn::readNetFromCaffe(prototxt, caffemodel); net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
} }
inline int judgeCharRange(int id) inline int judgeCharRange(int id)
{return id<31 || id>63; {return id<31 || id>63;
} }
std::pair<std::string,float> decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table,float thres) std::pair<std::string,float> decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table,float thres)
{ {
// cv::imshow("imagea",code_table);
// cv::waitKey(0);
cv::MatSize mtsize = code_table.size; cv::MatSize mtsize = code_table.size;
int sequencelength = mtsize[2]; int sequencelength = mtsize[2];
int labellength = mtsize[1]; int labellength = mtsize[1];
cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table); cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
std::string name = ""; std::string name = "";
std::vector<int> seq(sequencelength); std::vector<int> seq(sequencelength);
std::vector<std::pair<int,float>> seq_decode_res; std::vector<std::pair<int,float>> seq_decode_res;
for(int i = 0 ; i < sequencelength; i++) { for(int i = 0 ; i < sequencelength; i++) {
float *fstart = ((float *) (code_table.data) + i * labellength ); float *fstart = ((float *) (code_table.data) + i * labellength );
int id = std::max_element(fstart,fstart+labellength) - fstart; int id = std::max_element(fstart,fstart+labellength) - fstart;
@ -36,10 +26,7 @@ namespace pr {
} }
float sum_confidence = 0; float sum_confidence = 0;
int plate_lenghth = 0 ; int plate_lenghth = 0 ;
for(int i = 0 ; i< sequencelength ; i++) for(int i = 0 ; i< sequencelength ; i++)
{ {
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1])) if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
@ -48,13 +35,9 @@ namespace pr {
float confidence = *(fstart+seq[i]); float confidence = *(fstart+seq[i]);
std::pair<int,float> pair_(seq[i],confidence); std::pair<int,float> pair_(seq[i],confidence);
seq_decode_res.push_back(pair_); seq_decode_res.push_back(pair_);
//
} }
} }
int i = 0; int i = 0;
if (seq_decode_res.size()>1 && judgeCharRange(seq_decode_res[0].first) && judgeCharRange(seq_decode_res[1].first)) if (seq_decode_res.size()>1 && judgeCharRange(seq_decode_res[0].first) && judgeCharRange(seq_decode_res[1].first))
{ {
i=2; i=2;
@ -70,16 +53,12 @@ namespace pr {
sum_confidence +=seq_decode_res[i].second; sum_confidence +=seq_decode_res[i].second;
plate_lenghth++; plate_lenghth++;
} }
std::pair<std::string,float> res; std::pair<std::string,float> res;
res.second = sum_confidence/plate_lenghth; res.second = sum_confidence/plate_lenghth;
res.first = name; res.first = name;
return res; return res;
} }
std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table) std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table)
{ {
cv::MatSize mtsize = code_table.size; cv::MatSize mtsize = code_table.size;
@ -98,21 +77,13 @@ namespace pr {
if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1])) if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
name+=mapping_table[seq[i]]; name+=mapping_table[seq[i]];
} }
std::cout<<name;
return name; return name;
} }
std::pair<std::string,float> SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image,std::vector<std::string> mapping_table) { std::pair<std::string,float> SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image,std::vector<std::string> mapping_table) {
cv::transpose(Image,Image); cv::transpose(Image,Image);
cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40,160)); cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40,160));
net.setInput(inputBlob, "data"); net.setInput(inputBlob, "data");
cv::Mat char_prob_mat = net.forward(); cv::Mat char_prob_mat = net.forward();
return decodeResults(char_prob_mat,mapping_table,0.00); return decodeResults(char_prob_mat,mapping_table,0.00);
} }
} }

Loading…
Cancel
Save