Update FastDeskew.cpp
This commit is contained in:
@@ -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 correctPlateImage(cv::Mat skewPlate,float angle,float maxAngle)
|
||||||
{
|
{
|
||||||
|
|
||||||
cv::Mat dst;
|
cv::Mat dst;
|
||||||
|
|
||||||
cv::Size size_o(skewPlate.cols,skewPlate.rows);
|
cv::Size size_o(skewPlate.cols,skewPlate.rows);
|
||||||
|
|
||||||
|
|
||||||
int extend_padding = 0;
|
int extend_padding = 0;
|
||||||
// if(angle<0)
|
extend_padding = static_cast<int>(skewPlate.rows*tan(cv::abs(angle)/180* 3.14) );
|
||||||
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;
|
|
||||||
|
|
||||||
cv::Size size(skewPlate.cols + extend_padding ,skewPlate.rows);
|
cv::Size size(skewPlate.cols + extend_padding ,skewPlate.rows);
|
||||||
|
|
||||||
float interval = abs(sin((angle /180) * 3.14)* 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)};
|
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) {
|
if(angle>0) {
|
||||||
cv::Point2f pts2[4] = {cv::Point2f(interval, 0), cv::Point2f(0, size_o.height),
|
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::Point2f(size_o.width, 0), cv::Point2f(size_o.width - interval, size_o.height)};
|
||||||
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
|
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
|
||||||
cv::warpPerspective(skewPlate,dst,M,size);
|
cv::warpPerspective(skewPlate,dst,M,size);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cv::Point2f pts2[4] = {cv::Point2f(0, 0), cv::Point2f(interval, size_o.height), cv::Point2f(size_o.width-interval, 0),
|
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::Point2f(size_o.width, size_o.height)};
|
||||||
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
|
cv::Mat M = cv::getPerspectiveTransform(pts1,pts2);
|
||||||
cv::warpPerspective(skewPlate,dst,M,size,cv::INTER_CUBIC);
|
cv::warpPerspective(skewPlate,dst,M,size,cv::INTER_CUBIC);
|
||||||
|
|
||||||
}
|
}
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
cv::Mat fastdeskew(cv::Mat skewImage,int blockSize){
|
cv::Mat fastdeskew(cv::Mat skewImage,int blockSize){
|
||||||
|
|
||||||
|
|
||||||
const int FILTER_WINDOWS_SIZE = 5;
|
const int FILTER_WINDOWS_SIZE = 5;
|
||||||
std::vector<float> angle_list(180);
|
std::vector<float> angle_list(180);
|
||||||
memset(angle_list.data(),0,angle_list.size()*sizeof(int));
|
memset(angle_list.data(),0,angle_list.size()*sizeof(int));
|
||||||
|
|
||||||
cv::Mat bak;
|
cv::Mat bak;
|
||||||
skewImage.copyTo(bak);
|
skewImage.copyTo(bak);
|
||||||
if(skewImage.channels() == 3)
|
if(skewImage.channels() == 3)
|
||||||
cv::cvtColor(skewImage,skewImage,cv::COLOR_RGB2GRAY);
|
cv::cvtColor(skewImage,skewImage,cv::COLOR_RGB2GRAY);
|
||||||
|
|
||||||
if(skewImage.channels() == 1)
|
if(skewImage.channels() == 1)
|
||||||
{
|
{
|
||||||
cv::Mat eigen;
|
cv::Mat eigen;
|
||||||
|
|
||||||
cv::cornerEigenValsAndVecs(skewImage,eigen,blockSize,5);
|
cv::cornerEigenValsAndVecs(skewImage,eigen,blockSize,5);
|
||||||
for( int j = 0; j < skewImage.rows; j+=blockSize )
|
for( int j = 0; j < skewImage.rows; j+=blockSize )
|
||||||
{ for( int i = 0; i < skewImage.cols; i+=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];
|
float y2 = eigen.at<cv::Vec6f>(j, i)[5];
|
||||||
int angle_cell = angle(x2,y2);
|
int angle_cell = angle(x2,y2);
|
||||||
angle_list[(angle_cell + 180)%180]+=1.0;
|
angle_list[(angle_cell + 180)%180]+=1.0;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::vector<float> filtered = avgfilter(angle_list,5);
|
std::vector<float> filtered = avgfilter(angle_list,5);
|
||||||
|
|
||||||
int maxPos = std::max_element(filtered.begin(),filtered.end()) - filtered.begin() + FILTER_WINDOWS_SIZE/2;
|
int maxPos = std::max_element(filtered.begin(),filtered.end()) - filtered.begin() + FILTER_WINDOWS_SIZE/2;
|
||||||
if(maxPos>ANGLE_MAX)
|
if(maxPos>ANGLE_MAX)
|
||||||
maxPos = (-maxPos+90+180)%180;
|
maxPos = (-maxPos+90+180)%180;
|
||||||
|
|||||||
Reference in New Issue
Block a user