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

Bagaimana untuk Mensimulasikan Deskewing Mata Menggunakan `warpAffine` OpenCV?

Patricia Arquette
Lepaskan: 2024-11-28 11:49:10
asal
108 orang telah melayarinya

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

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!

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