Heim > Backend-Entwicklung > C++ > Wie kann man eine Reihe von Punkten mithilfe von cv::warpPerspective geradeausrichten?

Wie kann man eine Reihe von Punkten mithilfe von cv::warpPerspective geradeausrichten?

Linda Hamilton
Freigeben: 2024-12-03 17:40:12
Original
790 Leute haben es durchsucht

How to Deskew a Set of Points Using cv::warpPerspective?

cv::warpPerspective für eine gefälschte Geradeausrichtung auf einem Satz von cv::Point ausführen

Frage: Wie Erreiche ich mit cv::warpPerspective einen Entzerrungseffekt auf eine Reihe von Punkten? Die Punkte liegen nicht in einer bestimmten Reihenfolge vor und werden in einem Vektor gespeichert.

Das Problem verstehen:

  • Falsche Punktreihenfolge: Die Reihenfolge der Punkte im Eingabe- und Ausgabevektoren müssen übereinstimmen, um die gewünschte Transformation zu erreichen.
  • Falsche Bildgröße: Das Ausgabebild sollte eine Breite und Höhe haben, die dem umgrenzenden Rechteck entsprechen des entzerrten Objekts.

Schritte für eine gefälschte Entzerrung:

  1. Korrekte Punktreihenfolge: Stellen Sie die Reihenfolge der Punkte sicher Sowohl Eingabe- als auch Ausgabevektoren folgen der gleichen Reihenfolge (z. B. oben links, unten links, unten rechts, oben rechts).
  2. Anpassung des gedrehten Rechtecks: Verwenden Sie cv::minAreaRect(), um ein gedrehtes Rechteck um die Eingabepunkte zu erstellen. Beachten Sie jedoch, dass diese Methode die ursprünglichen Punktkoordinaten leicht verändern kann.
  3. Affine Transformation: Nutzen Sie die affinen Transformationsfunktionen cv::getAffineTransform() und cv::warpAffine() Sie sind für diesen speziellen Entzerrungsvorgang rechnerisch effizienter.
  4. Unterschiedliche Ausgabe Größe: Damit das entzerrte Bild nur das interessierende Objekt enthält, definieren Sie eine neue Bildgröße (z. B. cv::Size(width, height)), die der Größe des umgrenzenden Rechtecks ​​entspricht.
  5. Affintransformation anwenden: Übergeben Sie das Eingabebild, die Eingabepunkte, die Ausgabepunkte und die definierte Ausgabegröße an cv::warpAffine(), um die eigentliche Entzerrung durchzuführen Transformation.

Beispielcode:

#include <opencv2/opencv.hpp>

int main() {
    // Input image
    Mat src = imread("input.jpg");

    // Input points (not in particular order)
    vector<Point> points = {
        Point(408, 69), // Top-left
        Point(72, 2186), // Bottom-left
        Point(1584, 2426), // Bottom-right
        Point(1912, 291), // Top-right
    };

    // Rotated rectangle (bounding box)
    RotatedRect boundingRect = minAreaRect(Mat(points));

    // Corrected point ordering
    Point2f vertices[3];
    vertices[0] = boundingRect.center + boundingRect.size * 0.5f; // Top-left
    vertices[1] = boundingRect.center + boundingRect.size * 0.5f; // Bottom-left
    vertices[1].y += boundingRect.size.height;
    vertices[2] = boundingRect.center - boundingRect.size * 0.5f; // Bottom-right

    // Output point ordering
    Point2f outputVertices[3];
    outputVertices[0] = Point(0, 0); // Top-left
    outputVertices[1].x = outputVertices[0].x + boundingRect.size.width; // Bottom-left
    outputVertices[1].y = outputVertices[1].x;
    outputVertices[2] = outputVertices[0]; // Bottom-right

    // Affine transformation matrix
    Mat transformationMatrix = getAffineTransform(vertices, outputVertices);

    // Deskewed image with corrected size
    Mat deskewedImage;
    Size outputSize(boundingRect.size.width, boundingRect.size.height);
    warpAffine(src, deskewedImage, transformationMatrix, outputSize, INTER_LINEAR);

    // Save deskewed image
    imwrite("deskewed.jpg", deskewedImage);
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man eine Reihe von Punkten mithilfe von cv::warpPerspective geradeausrichten?. 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