Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengecilkan Mata Menggunakan Transformasi Perspektif dan Transformasi Affine?

Bagaimana untuk Mengecilkan Mata Menggunakan Transformasi Perspektif dan Transformasi Affine?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-21 01:15:15442semak imbas

How to Deskew Points Using Perspective Transformation and Affine Transforms?

Transformasi Perspektif untuk Deskewing

Untuk mencapai kesan deskewing pada set mata menggunakan transformasi perspektif, adalah penting untuk memahami perkara berikut:

Titik Pesanan:

Susunan mata penting dalam transformasi perspektif. Untuk memastikan ketepatan, susunan mesti konsisten dalam kedua-dua vektor sumber dan destinasi.

Saiz Imej:

Jika anda mahu imej yang terhasil hanya mengandungi objek minat, tetapkan lebar dan tingginya agar sepadan dengan dimensi segi empat tepat yang terhasil.

Prestasi Pertimbangan:

Untuk transformasi affine seperti putar, ubah saiz dan deskew, adalah lebih cekap untuk menggunakan affine rakan sejawat:

  • getAffineTransform()
  • warpAffine()

Affine Transform:

getAffineTransform() hanya memerlukan tiga mata dan menyediakan matriks 2x3, manakala warpAffine() melakukan peledingan.

Mengubah saiz Imej Terhasil:

Untuk mengubah saiz imej yang terhasil kepada saiz yang berbeza daripada input, gunakan:

cv::Size size(box.boundingRect().width, box.boundingRect().height);
cv::warpPerspective(src, dst, size, ... );

Contoh:

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

RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

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

Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

cv::Size size(box.boundingRect().width, box.boundingRect().height);
warpAffine(src, rotated, warpAffineMatrix, size, INTER_LINEAR, BORDER_CONSTANT);

Atas ialah kandungan terperinci Bagaimana untuk Mengecilkan Mata Menggunakan Transformasi Perspektif dan Transformasi Affine?. 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