2012-01-27 34 views
9

Tôi có một mạng lưới, ví dụ, 11 x 11 đỉnh. Ý tưởng là mỗi điểm (đỉnh) giữ vị trí dấu chấm động chuẩn hóa của điểm ảnh đó trong hình ảnh bị biến dạng. Ví dụ. nếu tôi muốn kéo dài cạnh trên bên trái, tôi viết ở đỉnh đầu tiên (-0,1, -0,1).Làm thế nào để sử dụng cv :: remap với lưới phía trước, không đảo ngược lưới, để hình ảnh dọc?

Tôi có lưới, nhưng không có chức năng cong vênh hình ảnh. cv::remap thực hiện chính xác điều đó ... nhưng theo thứ tự ngược lại - lưới "nói" vùng lân cận pixel nào để ánh xạ tới lưới thông thường trên đầu ra.

Có cách nào tiêu chuẩn trong OpenCV để xử lý cong vênh ngược không? Tôi có thể dễ dàng chuyển đổi lưới hoặc sử dụng một chức năng khác không? Tôi đang sử dụng OpenCV và Boost, nhưng bất kỳ thư viện/công cụ miễn phí nào có hiệu quả với tôi.

PS: Tôi cần điều này đang chạy trên máy tính Linux.

+0

Tôi đã giải quyết được sự cố của mình. Vấn đề là khẩn cấp thực sự, vì vậy tôi chọc những người xung quanh trong văn phòng, cho đến khi một giải pháp được tìm thấy (một độc quyền, than ôi). Tuy nhiên, tôi vẫn còn rất bối rối tại sao một vấn đề như vậy (hình ảnh cong vênh thông qua một lưới chuyển tiếp) chưa được giải quyết một cách cởi mở, miễn phí và dễ tiếp cận. – Vorac

+0

Bạn có thể vui lòng cung cấp một số chi tiết về cách bạn giải quyết vấn đề? – Marcin

+0

@Marcin, tiếc là anh chàng EGL đã viết một người lập bản đồ ngược lại cho thiết bị trong một tuần có thể (đó là những gì tôi có nghĩa là bởi 'giải pháp độc quyền'). Nó vẫn còn câu đố tôi tại sao chức năng như vậy không được bao gồm trong OpenCV. Có lẽ một ngày nào đó ai đó sẽ giải quyết vấn đề và gửi một tham chiếu đến yêu cầu kéo ở đây như là một câu trả lời. Có lẽ tôi, hmmmmm, hoặc bạn. – Vorac

Trả lời

1

Bạn cần tính toán một bản đồ khác cho phép biến đổi ngược.

Nhưng, bạn cần công thức biến đổi hoặc ma trận.

Bước 1: Chọn 4 điểm trên hình ảnh được ánh xạ lại. Một ý tưởng tốt sẽ được để có những góc, nếu các góc không đen (undefined)

Bước 2: Tìm vị trí của họ trong ảnh gốc (nhìn vào bản đồ cho rằng)

Bước 3 : Tính toán homography giữa hai tập hợp các điểm. findHomoraphy() là chìa khóa.

Bước 4: warpTham quan hình ảnh thứ hai. Bên trong, nó tính toán lưới, sau đó gọi remap();

Nếu bạn có cùng biến đổi như trước đó, đảo ngược điểm đầu vào với điểm đầu ra trong findHomography hoặc inv() ma trận kết quả.

Nếu bạn muốn có bản đồ cho nhiều cuộc gọi (nhanh hơn gọi warpPerspective mỗi lần), bạn phải sao chép mã từ warpPerspective trong một hàm mới.

+0

Xin chào, vasile và cảm ơn cho câu trả lời. Tôi nghĩ rằng nó không phải là những gì tôi đang tìm kiếm, vì nó cắt giảm mức độ tự do. Tôi sẽ giải thích - lưới là tùy ý và không có ràng buộc các đường thẳng trong hình ảnh ban đầu được chiếu thành các đường thẳng trong kết quả. – Vorac

+0

Hmmm, giải pháp của tôi chỉ hoạt động đối với các biến đổi được mô tả bằng mối quan hệ hình học - một biến đổi 3D.Nếu lưới của bạn mô tả sự biến dạng ống kính mắt cá, hoặc một cái gì đó như thế, giải pháp duy nhất là viết một hàm lấy lưới đầu vào và tạo ra một hàm đầu ra như một hàm nghịch đảo. – Sam

+0

Vâng, thậm chí tổng quát hơn - các vị trí nút lưới khá tùy ý. Biến ra một chức năng thay thế cho một trong Opencv, nhưng điều đó chấp nhận phía trước-ánh xạ dọc được "dễ dàng" thực hiện trong OpenGL - "chỉ" về công việc của một tuần. Một giải pháp được đề xuất khác là viết một hàm mà bạn đề cập - một số nội suy tuyến tính trên lưới đầu ra (không phải hình chữ nhật), để tìm các tọa độ lưới đầu vào tương ứng. – Vorac

Các vấn đề liên quan