Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mengeluarkan Set Mata Menggunakan cv::warpPerspective?

Bagaimana untuk Mengeluarkan Set Mata Menggunakan cv::warpPerspective?

Linda Hamilton
Lepaskan: 2024-12-03 17:40:12
asal
873 orang telah melayarinya

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

Melaksanakan cv::warpPerspective untuk Deskewing Palsu pada Set cv::Point

Soalan: Bagaimana adakah saya mencapai kesan deskewing pada set mata menggunakan cv::warpPerspective? Mata tidak dalam susunan tertentu dan disimpan dalam vektor.

Memahami Isu:

  • Penyusunan mata yang salah: Susunan mata dalam vektor input dan output mesti sepadan untuk mencapai transformasi yang diingini.
  • Saiz imej yang salah: Imej output harus mempunyai lebar dan ketinggian yang sepadan dengan segi empat tepat mengikat objek yang dikurung.

Langkah-Langkah untuk Menyusun Palsu:

  1. Pemesanan Titik yang Betul: Pastikan susunan titik dalam kedua-dua vektor input dan output mengikut urutan yang sama (cth., kiri atas, bawah-kiri, bawah-kanan, atas-kanan).
  2. Pelarasan Segiempat Diputar: Gunakan cv::minAreaRect() untuk mencipta segi empat tepat diputar di sekeliling titik input. Walau bagaimanapun, ambil perhatian bahawa kaedah ini mungkin mengubah sedikit koordinat titik asal.
  3. Affine Transform: Gunakan fungsi affine transform, cv::getAffineTransform() dan cv::warpAffine(), sebagai mereka adalah lebih cekap dari segi pengiraan untuk operasi deskewing khusus ini.
  4. Output Berbeza Saiz: Untuk memastikan imej yang dilekatkan hanya mengandungi objek yang diminati, tentukan saiz imej baharu (cth., cv::Saiz(lebar, tinggi)) yang sepadan dengan saiz segi empat tepat terikat.
  5. Gunakan Affine Transform: Hantar imej input, titik input, titik output dan saiz output yang ditentukan kepada cv::warpAffine() untuk melaksanakan transformasi deskewing sebenar.

Contoh Kod:

#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);
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengeluarkan Set Mata Menggunakan cv::warpPerspective?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan