Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-21 01:15:15342parcourir

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, ... );

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);

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!

Déclaration:
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