Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Punkte mithilfe von Perspektivtransformationen und affinen Transformationen korrigiert werden?

Wie können Punkte mithilfe von Perspektivtransformationen und affinen Transformationen korrigiert werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-21 01:15:15345Durchsuche

How to Deskew Points Using Perspective Transformation and Affine Transforms?

Perspektivtransformation für die Schräglagenkorrektur

Um mithilfe der Perspektivtransformation einen Schräglageneffekt auf eine Reihe von Punkten zu erzielen, ist es wichtig, Folgendes zu verstehen:

Punktreihenfolge:

Die Reihenfolge der Punkte ist in der Perspektive wichtig Transformation. Um die Genauigkeit zu gewährleisten, muss die Reihenfolge sowohl im Quell- als auch im Zielvektor konsistent sein.

Bildgröße:

Wenn Sie möchten, dass das resultierende Bild nur das Objekt von enthält Stellen Sie bei Bedarf Breite und Höhe so ein, dass sie mit den Abmessungen des resultierenden Rechtecks ​​übereinstimmen.

Leistung Überlegungen:

Für affine Transformationen wie Drehen, Größenänderung und Ausrichtung ist es effizienter, die affinen Gegenstücke zu verwenden:

  • getAffineTransform()
  • warpAffine ()

Affin Transformieren:

getAffineTransform() erfordert nur drei Punkte und stellt eine 2x3-Matrix bereit, während warpAffine() die Verzerrung durchführt.

Größenänderung des resultierenden Bildes:

Um die Größe des resultierenden Bildes auf eine andere Größe als die Eingabe zu ändern, verwenden:

cv::Size size(box.boundingRect().width, box.boundingRect().height);
cv::warpPerspective(src, dst, size, ... );

Beispiel:

vector<Point> not_a_rect_shape;
not_a_rect_shape.push_back(Point(408, 69));
not_a_rect_shape.push_back(Point(72, 2186));
not_a_rect_shape.push_back(Point(1584, 2426));
not_a_rect_shape.push_back(Point(1912, 291));

RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

Point2f pts[4];
box.points(pts);

Point2f src_vertices[3];
src_vertices[0] = pts[0];
src_vertices[1] = pts[1];
src_vertices[2] = pts[3];

Point2f dst_vertices[3];
dst_vertices[0] = Point(0, 0);
dst_vertices[1] = Point(box.boundingRect().width-1, 0);
dst_vertices[2] = Point(0, box.boundingRect().height-1);

Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

cv::Size size(box.boundingRect().width, box.boundingRect().height);
warpAffine(src, rotated, warpAffineMatrix, size, INTER_LINEAR, BORDER_CONSTANT);

Das obige ist der detaillierte Inhalt vonWie können Punkte mithilfe von Perspektivtransformationen und affinen Transformationen korrigiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn