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
785 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!

sumber:php.cn
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