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
Lepaskan: 2024-11-21 01:15:15
asal
396 orang telah melayarinya

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

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

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!

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