improved perspective projection filter by changing the destination image size

This commit is contained in:
Steffen Vogel 2015-01-24 11:09:37 +01:00
parent fbee925fee
commit 9976d94a13
3 changed files with 18 additions and 15 deletions

View file

@ -27,7 +27,7 @@ Pattern::Pattern(Size si, Size sp, Type t) :
mapType[QUADRILINEAR_MARKERS] = "Quadrilinear Markers";
settings["Size"] = new SizeSetting(this, size, Range<int>(1, 16));
settings["Spacing"] = new SizeSetting(this, spacing, Range<int>(0, 300));
settings["Spacing"] = new SizeSetting(this, spacing, Range<int>(0, 5000));
settings["Type"] = new EnumSetting(this, (int&) type, mapType);
if (type == QUADRILINEAR_MARKERS) {
@ -162,10 +162,9 @@ std::vector<Point3f> Pattern::getPoints() const
std::vector<int> Pattern::getCornerIndizes() const
{
return {
0,
size.width - 1,
size.width * size.height - size.width,
size.width * size.height - 1
0, size.width - 1,
size.area() - size.width,
size.area() - 1
};
}

View file

@ -6,9 +6,12 @@
#include "perspective.h"
Perspective::Perspective(Camera *c, Pattern *p) :
alpha(1),
cam(c),
pattern(p)
{ }
{
settings["Scale"] = new DoubleSetting(this, alpha, Range<double>(0.5, 2));
}
Result * Perspective::applyInternal(Image *img)
{
@ -17,25 +20,24 @@ Result * Perspective::applyInternal(Image *img)
if (presult && presult->isFound()) {
Mat map;
std::vector<Point2f> src, dest, tmp;
std::vector<Point2f> src, dest;
std::vector<Point2f> srcPoints = presult->getPoints();
std::vector<Point3f> destPoints = pattern->getPoints();
for (int i : pattern->getCornerIndizes()) {
src.push_back(srcPoints[i]);
tmp.push_back(Point2f(destPoints[i].x, destPoints[i].y));
dest.push_back(Point2f(destPoints[i].x, destPoints[i].y));
}
int destWidth = 0.9 * m.cols;
int destHeight = tmp[2].y * (destWidth / tmp[1].x);
double scale = alpha * norm(src[1] - src[0]) / norm(dest[1] - dest[0]);
dest.push_back(Point2f((m.cols - destWidth) / 2, (m.rows - destHeight) / 2));
dest.push_back(dest[0] + Point2f(destWidth, 0));
dest.push_back(dest[0] + Point2f(0, destHeight));
dest.push_back(dest[0] + Point2f(destWidth, destHeight));
for (Point2f &p : dest)
p *= scale;
Size newSize(dest[3].x, dest[3].y);
map = getPerspectiveTransform(src, dest);
warpPerspective(m, m, map, m.size());
warpPerspective(m, m, map, newSize);
return new Result(toQTransform(map));
}

View file

@ -14,6 +14,8 @@ class Perspective : public Filter
protected:
Result * applyInternal(Image *img);
double alpha;
Camera *cam;
Pattern *pattern;
};