Maison > développement back-end > C++ > Comment redresser les points à l'aide de la transformation de perspective et des transformations affines ?

Comment redresser les points à l'aide de la transformation de perspective et des transformations affines ?

Mary-Kate Olsen
Libérer: 2024-11-21 01:15:15
original
396 Les gens l'ont consulté

How to Deskew Points Using Perspective Transformation and Affine Transforms?

Transformation de perspective pour le redressement

Pour obtenir un effet de redressement sur un ensemble de points à l'aide de la transformation de perspective, il est essentiel de comprendre ce qui suit :

Ordre des points :

L'ordre des points compte dans transformation des perspectives. Pour garantir l'exactitude, l'ordre doit être cohérent dans les vecteurs source et de destination.

Taille de l'image :

Si vous souhaitez que l'image résultante contienne uniquement l'objet de intérêt, définissez sa largeur et sa hauteur pour qu'elles correspondent aux dimensions du rectangle obtenu.

Performance Considérations :

Pour les transformations affines telles que la rotation, le redimensionnement et le redressement, il est plus efficace d'utiliser les homologues affines :

  • getAffineTransform()
  • warpAffine ()

Affin Transform :

getAffineTransform() ne nécessite que trois points et fournit une matrice 2x3, tandis que warpAffine() effectue la déformation.

Redimensionnement de l'image résultante :

Pour redimensionner l'image résultante à une taille différente de celle de l'entrée, utiliser :

cv::Size size(box.boundingRect().width, box.boundingRect().height);
cv::warpPerspective(src, dst, size, ... );
Copier après la connexion

Exemple :

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);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal