Heim > Backend-Entwicklung > C++ > Wie simuliere ich die Entzerrung von Punkten mit „warpAffine' von OpenCV?

Wie simuliere ich die Entzerrung von Punkten mit „warpAffine' von OpenCV?

Patricia Arquette
Freigeben: 2024-11-28 11:49:10
Original
109 Leute haben es durchsucht

How to Simulate Deskewing of Points Using OpenCV's `warpAffine`?

Wie man mit cv::warpPerspective einen Fake-Deskewing-Effekt auf eine Reihe von Punkten erzielt

Problemstellung

Das Ziel besteht darin, eine Perspektive anzuwenden Transformation in eine Reihe von Punkten, um einen Entzerrungseffekt zu erzielen, ähnlich dem im folgenden Video gezeigten:

[Video Link](http://nuigroup.com/?ACT=28&fid=27&aid=1892_H6eNAaign4Mrnn30Au8d)

Ergebnisanalyse

Das bereitgestellte Beispielbild und der Code veranschaulichen den Entzerrungseffekt, sind jedoch nicht genau. Insbesondere enthält das transformierte Bild nicht den gesamten ROI und das Seitenverhältnis ist falsch.

Korrektur der Fehler

Um die Probleme zu beheben, wurden die folgenden Änderungen am Code vorgenommen:

  1. Sicherstellen der gleichen Scheitelpunktreihenfolge: Die Punkte im Quell- und Zielvektor müssen in der gleichen Reihenfolge sein (z. B. oben links, unten links, unten rechts, oben rechts).
  2. Anpassen der Ausgabebildgröße: Um den ROI richtig einzuschließen, sollte die Zielbildgröße sein auf die Größe des Begrenzungsrechtecks ​​um die ursprünglichen Punkte einstellen.
  3. Optimierung für Geschwindigkeit: Zur Leistungssteigerung werden die Funktionen der affinen Transformation verwendet (getAffineTransform() und warpAffine()) wurden anstelle der allgemeinen Perspektivtransformationsfunktionen verwendet.

Aktualisierter Code

void main()
{
    cv::Mat src = cv::imread("r8fmh.jpg", 1);

    // Points representing the corners of the paper
    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));

    // Debug drawing of the points
    const Point* point = &amp;not_a_rect_shape[0];
    int n = (int)not_a_rect_shape.size();
    Mat draw = src.clone();
    polylines(draw, &amp;point, &amp;n, 1, true, Scalar(0, 255, 0), 3, CV_AA);
    imwrite("draw.jpg", draw);

    // Rotated rectangle around the points
    RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

    // Source and destination vertex points
    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);

    // Affine transform matrix
    Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

    // Transformation and output image
    cv::Mat rotated;
    cv::Size size(box.boundingRect().width, box.boundingRect().height);
    warpAffine(src, rotated, warpAffineMatrix, size, INTER_LINEAR, BORDER_CONSTANT);

    imwrite("rotated.jpg", rotated);
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie simuliere ich die Entzerrung von Punkten mit „warpAffine' von OpenCV?. 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