Added additional transformation functions

This commit is contained in:
Matt Hill
2014-10-26 14:23:56 -04:00
parent c175342169
commit c04bad14f6
2 changed files with 54 additions and 1 deletions

View File

@@ -34,6 +34,17 @@ Transformation::~Transformation() {
// Re-maps the coordinates from the smallImage to the coordinate space of the bigImage. // Re-maps the coordinates from the smallImage to the coordinate space of the bigImage.
vector<Point2f> Transformation::transformSmallPointsToBigImage(vector<Point> points) vector<Point2f> Transformation::transformSmallPointsToBigImage(vector<Point> points)
{
vector<Point2f> floatPoints;
for (unsigned int i = 0; i < points.size(); i++)
floatPoints.push_back(points[i]);
return transformSmallPointsToBigImage(floatPoints);
}
// Re-maps the coordinates from the smallImage to the coordinate space of the bigImage.
vector<Point2f> Transformation::transformSmallPointsToBigImage(vector<Point2f> points)
{ {
vector<Point2f> bigPoints; vector<Point2f> bigPoints;
for (uint i = 0; i < points.size(); i++) for (uint i = 0; i < points.size(); i++)
@@ -60,12 +71,19 @@ Mat Transformation::getTransformationMatrix(vector<Point2f> corners, Size output
quad_pts.push_back(Point2f(outputImageSize.width, outputImageSize.height)); quad_pts.push_back(Point2f(outputImageSize.width, outputImageSize.height));
quad_pts.push_back(Point2f(0, outputImageSize.height)); quad_pts.push_back(Point2f(0, outputImageSize.height));
return getTransformationMatrix(corners, quad_pts);
}
Mat Transformation::getTransformationMatrix(vector<Point2f> corners, vector<Point2f> outputCorners)
{
// Get transformation matrix // Get transformation matrix
Mat transmtx = getPerspectiveTransform(corners, quad_pts); Mat transmtx = getPerspectiveTransform(corners, outputCorners);
return transmtx; return transmtx;
} }
Mat Transformation::crop(Size outputImageSize, Mat transformationMatrix) Mat Transformation::crop(Size outputImageSize, Mat transformationMatrix)
{ {
@@ -81,6 +99,15 @@ Mat Transformation::crop(Size outputImageSize, Mat transformationMatrix)
return deskewed; return deskewed;
} }
vector<Point2f> Transformation::remapSmallPointstoCrop(vector<Point> smallPoints, cv::Mat transformationMatrix)
{
vector<Point2f> floatPoints;
for (unsigned int i = 0; i < smallPoints.size(); i++)
floatPoints.push_back(smallPoints[i]);
return remapSmallPointstoCrop(floatPoints, transformationMatrix);
}
vector<Point2f> Transformation::remapSmallPointstoCrop(vector<Point2f> smallPoints, cv::Mat transformationMatrix) vector<Point2f> Transformation::remapSmallPointstoCrop(vector<Point2f> smallPoints, cv::Mat transformationMatrix)
{ {
vector<Point2f> remappedPoints; vector<Point2f> remappedPoints;
@@ -89,3 +116,24 @@ vector<Point2f> Transformation::remapSmallPointstoCrop(vector<Point2f> smallPoin
return remappedPoints; return remappedPoints;
} }
Size Transformation::getCropSize(vector<Point2f> areaCorners, Size targetSize)
{
// Figure out the approximate width/height of the license plate region, so we can maintain the aspect ratio.
LineSegment leftEdge(round(areaCorners[3].x), round(areaCorners[3].y), round(areaCorners[0].x), round(areaCorners[0].y));
LineSegment rightEdge(round(areaCorners[2].x), round(areaCorners[2].y), round(areaCorners[1].x), round(areaCorners[1].y));
LineSegment topEdge(round(areaCorners[0].x), round(areaCorners[0].y), round(areaCorners[1].x), round(areaCorners[1].y));
LineSegment bottomEdge(round(areaCorners[3].x), round(areaCorners[3].y), round(areaCorners[2].x), round(areaCorners[2].y));
float w = distanceBetweenPoints(leftEdge.midpoint(), rightEdge.midpoint());
float h = distanceBetweenPoints(bottomEdge.midpoint(), topEdge.midpoint());
float aspect = w/h;
int width = targetSize.width;
int height = round(((float) width) / aspect);
if (height > targetSize.height)
{
height = targetSize.height;
width = round(((float) height) * aspect);
}
return Size(width, height);
}

View File

@@ -21,6 +21,7 @@
#define OPENALPR_TRANSFORMATION_H #define OPENALPR_TRANSFORMATION_H
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/imgproc/imgproc.hpp"
#include "utility.h"
class Transformation { class Transformation {
public: public:
@@ -28,12 +29,16 @@ public:
virtual ~Transformation(); virtual ~Transformation();
std::vector<cv::Point2f> transformSmallPointsToBigImage(std::vector<cv::Point> points); std::vector<cv::Point2f> transformSmallPointsToBigImage(std::vector<cv::Point> points);
std::vector<cv::Point2f> transformSmallPointsToBigImage(std::vector<cv::Point2f> points);
cv::Mat getTransformationMatrix(std::vector<cv::Point2f> corners, cv::Size outputImageSize); cv::Mat getTransformationMatrix(std::vector<cv::Point2f> corners, cv::Size outputImageSize);
cv::Mat getTransformationMatrix(std::vector<cv::Point2f> corners, std::vector<cv::Point2f> outputCorners);
cv::Mat crop(cv::Size outputImageSize, cv::Mat transformationMatrix); cv::Mat crop(cv::Size outputImageSize, cv::Mat transformationMatrix);
std::vector<cv::Point2f> remapSmallPointstoCrop(std::vector<cv::Point> smallPoints, cv::Mat transformationMatrix);
std::vector<cv::Point2f> remapSmallPointstoCrop(std::vector<cv::Point2f> smallPoints, cv::Mat transformationMatrix); std::vector<cv::Point2f> remapSmallPointstoCrop(std::vector<cv::Point2f> smallPoints, cv::Mat transformationMatrix);
cv::Size getCropSize(std::vector<cv::Point2f> areaCorners, cv::Size targetSize);
private: private:
cv::Mat bigImage; cv::Mat bigImage;