Rumah > pembangunan bahagian belakang > C++ > Mengapa Pelaksanaan cv::warpPerspective Deskewing Saya Menghasilkan Keputusan yang Salah, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Pelaksanaan cv::warpPerspective Deskewing Saya Menghasilkan Keputusan yang Salah, dan Bagaimana Saya Boleh Membetulkannya?

DDD
Lepaskan: 2024-11-23 03:32:11
asal
698 orang telah melayarinya

Why Does My cv::warpPerspective Deskewing Implementation Produce Incorrect Results, and How Can I Fix It?

Cara Melaksanakan cv::warpPerspective dengan Betul untuk Menjauhkan Set Mata

Masalah:

Percubaan untuk menggunakan cv ::warpPerspective untuk mencapai kesan deskewing pada set mata telah menghasilkan hasil yang tidak memuaskan. Kemeja meja yang diingini digambarkan oleh segi empat tepat hijau dalam imej di bawah:

[Imej dokumen dengan segi empat tepat hijau yang menggariskan kawasan yang diminati]

Punca:

Keputusan yang salah boleh dikaitkan dengan beberapa faktor:

  1. Tertib Titik: Titik dalam vektor input dan output mestilah dalam susunan yang sama (cth., kiri atas, kiri bawah, kanan bawah, atas -kanan).
  2. Saiz Imej Output: Untuk mengelakkan imej yang terhasil daripada mengandungi latar belakang yang berlebihan, lebar dan ketinggian hendaklah ditetapkan agar sepadan dengan segi empat tepat terikat di sekeliling kawasan yang dilekatkan.

Penyelesaian:

Untuk menyelesaikan isu ini, kod di bawah telah diubah suai :

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

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

    // Assemble a rotated rectangle from the points
    RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

    // Extract the corner points of the rotated rectangle
    Point2f pts[4];
    box.points(pts);

    // Define the vertices for the warp transformation
    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);

    // Use the affine transform as it's faster for the given use case
    Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

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

Penambahbaikan:

Kepada meningkatkan lagi kecekapan, pertimbangkan untuk menggunakan cv::getAffineTransform() dan cv::warpAffine() dan bukannya cv::getPerspectiveTransform() dan cv::warpPerspective(). Fungsi ini direka khusus untuk transformasi affine dan jauh lebih pantas.

Atas ialah kandungan terperinci Mengapa Pelaksanaan cv::warpPerspective Deskewing Saya Menghasilkan Keputusan yang Salah, dan Bagaimana Saya Boleh Membetulkannya?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan