Heim > Backend-Entwicklung > C++ > 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
Freigeben: 2024-11-21 01:15:15
Original
396 Leute haben es durchsucht

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, ... );
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage