[EDITED] Đây là cách nó được thực hiện.
Các bước: 1. Cô lập Phần phân chia đường.
Sau đó, sử dụng Houghlines, tìm ra các dòng dài nhất trong Hình ảnh. Tìm ra các điểm cực trị mà ranh giới hình ảnh chéo. Bạn đã có điểm tứ giác. Tôi bỏ qua phần này bằng cách chọn chúng một cách thủ công. Trong trường hợp của tôi, chiều rộng của đường ở trên cùng của hình ảnh là 10 và ở dưới cùng là 60.
Bây giờ, đối với Đích, chúng ta phải Hình ảnh sao cho Tứ giác Divider có chiều rộng đồng nhất là 60, vì vậy chúng ta lưu vào một điểm mới khác, có cùng điểm dưới cùng, nhưng các điểm trên cùng được sửa đổi khi chúng tạo thành một hình chữ nhật có chiều cao giống như hình ảnh (hoặc lớn hơn, bạn có thể điều chỉnh vì nó phù hợp với bạn sau khi chạy một lần và xem kết quả), nhưng chiều rộng 60. Hãy nhớ rằng, chúng tôi đang chuyển đổi hình ảnh của mình sao cho dải phân cách phù hợp với Khu vực hình chữ nhật này. Hình ảnh sẽ tự động thay đổi.
Bây giờ, sử dụng
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
của opencv trên các điểm tứ giác ban đầu và đích, chúng ta có được Ma trận biến đổi, mà chúng ta áp dụng cho Hình ảnh thử nghiệm của mình.
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
Bạn sẽ thấy rất nhiều Vùng được cắt để phù hợp với Đầu ra ở Kích thước đầu vào. Tuy nhiên, bạn sẽ nhận thấy rằng Hình ảnh được chuyển đổi để có Bộ chia song song, như chúng tôi mong đợi. Bằng cách thực hiện một số Dịch và Nội dung, và lấy Hình ảnh Đầu ra Kích thước lớn hơn, bạn sẽ có được điều này. Chúng tôi không bao giờ có thể có được một Hình ảnh đầu ra được bao bọc hoàn hảo, vì kích thước của nó có thể rất lớn. Nhưng chúng tôi sẽ đạt được một số hạn chế sẽ hoàn thành nhiệm vụ của chúng tôi. Đây là hình ảnh cuối cùng: