| @@ -1,5 +1,5 @@ | |||
| // | |||
| // Created by 庾金科 on 02/10/2017. | |||
| // Created by Jack Yu on 02/10/2017. | |||
| // | |||
| @@ -51,59 +51,38 @@ namespace pr{ | |||
| cv::Mat correctPlateImage(cv::Mat skewPlate,float angle,float maxAngle) | |||
| { | |||
| cv::Mat dst; | |||
| cv::Size size_o(skewPlate.cols,skewPlate.rows); | |||
| int extend_padding = 0; | |||
| // if(angle<0) | |||
| extend_padding = static_cast<int>(skewPlate.rows*tan(cv::abs(angle)/180* 3.14) ); | |||
| // else | |||
| // extend_padding = static_cast<int>(skewPlate.rows/tan(cv::abs(angle)/180* 3.14) ); | |||
| // std::cout<<"extend:"<<extend_padding<<std::endl; | |||
| extend_padding = static_cast<int>(skewPlate.rows*tan(cv::abs(angle)/180* 3.14) ); | |||
| cv::Size size(skewPlate.cols + extend_padding ,skewPlate.rows); | |||
| float interval = abs(sin((angle /180) * 3.14)* skewPlate.rows); | |||
| // std::cout<<interval<<std::endl; | |||
| cv::Point2f pts1[4] = {cv::Point2f(0,0),cv::Point2f(0,size_o.height),cv::Point2f(size_o.width,0),cv::Point2f(size_o.width,size_o.height)}; | |||
| if(angle>0) { | |||
| cv::Point2f pts2[4] = {cv::Point2f(interval, 0), cv::Point2f(0, size_o.height), | |||
| cv::Point2f(size_o.width, 0), cv::Point2f(size_o.width - interval, size_o.height)}; | |||
| cv::Mat M = cv::getPerspectiveTransform(pts1,pts2); | |||
| cv::warpPerspective(skewPlate,dst,M,size); | |||
| } | |||
| else { | |||
| cv::Point2f pts2[4] = {cv::Point2f(0, 0), cv::Point2f(interval, size_o.height), cv::Point2f(size_o.width-interval, 0), | |||
| cv::Point2f(size_o.width, size_o.height)}; | |||
| cv::Mat M = cv::getPerspectiveTransform(pts1,pts2); | |||
| cv::warpPerspective(skewPlate,dst,M,size,cv::INTER_CUBIC); | |||
| } | |||
| return dst; | |||
| } | |||
| cv::Mat fastdeskew(cv::Mat skewImage,int blockSize){ | |||
| const int FILTER_WINDOWS_SIZE = 5; | |||
| std::vector<float> angle_list(180); | |||
| memset(angle_list.data(),0,angle_list.size()*sizeof(int)); | |||
| cv::Mat bak; | |||
| skewImage.copyTo(bak); | |||
| if(skewImage.channels() == 3) | |||
| cv::cvtColor(skewImage,skewImage,cv::COLOR_RGB2GRAY); | |||
| if(skewImage.channels() == 1) | |||
| { | |||
| cv::Mat eigen; | |||
| cv::cornerEigenValsAndVecs(skewImage,eigen,blockSize,5); | |||
| for( int j = 0; j < skewImage.rows; j+=blockSize ) | |||
| { for( int i = 0; i < skewImage.cols; i+=blockSize ) | |||
| @@ -112,12 +91,10 @@ namespace pr{ | |||
| float y2 = eigen.at<cv::Vec6f>(j, i)[5]; | |||
| int angle_cell = angle(x2,y2); | |||
| angle_list[(angle_cell + 180)%180]+=1.0; | |||
| } | |||
| } | |||
| } | |||
| std::vector<float> filtered = avgfilter(angle_list,5); | |||
| int maxPos = std::max_element(filtered.begin(),filtered.end()) - filtered.begin() + FILTER_WINDOWS_SIZE/2; | |||
| if(maxPos>ANGLE_MAX) | |||
| maxPos = (-maxPos+90+180)%180; | |||