Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mensimulasikan Deskewing Mata Menggunakan `warpAffine` OpenCV?

Bagaimana untuk Mensimulasikan Deskewing Mata Menggunakan `warpAffine` OpenCV?

Patricia Arquette
Patricia Arquetteasal
2024-11-28 11:49:10196semak imbas

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

Cara Mencapai Kesan Deskewing Palsu pada Set Mata Menggunakan cv::warpPerspective

Pernyataan Masalah

Matlamatnya adalah untuk menggunakan perspektif penjelmaan kepada satu set mata untuk mendapatkan kesan mengering, serupa dengan yang ditunjukkan dalam berikut video:

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

Analisis Keputusan

Imej dan kod sampel yang disediakan menunjukkan kesan deskewing, tetapi ia tidak tepat. Khususnya, imej yang diubah tidak mengandungi keseluruhan ROI dan nisbah bidang adalah salah.

Membetulkan Ralat

Untuk menyelesaikan isu, perubahan berikut telah dibuat pada kod:

  1. Memastikan susunan bucu yang sama: Titik dalam kedua-dua vektor sumber dan destinasi mestilah dalam susunan yang sama (cth., kiri atas, kiri bawah, kanan bawah, kanan atas).
  2. Menyesuaikan saiz imej output: Untuk mengandungi ROI dengan betul, imej destinasi saiz hendaklah ditetapkan kepada saiz segi empat tepat terikat di sekeliling titik asal.
  3. Mengoptimumkan kelajuan: Untuk meningkatkan prestasi, fungsi transformasi affine (getAffineTransform() dan warpAffine()) digunakan dan bukannya fungsi transformasi perspektif umum.

Kod Kemas Kini

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);
}

Atas ialah kandungan terperinci Bagaimana untuk Mensimulasikan Deskewing Mata Menggunakan `warpAffine` OpenCV?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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