2013-05-31 36 views
5

Tôi mới vào Open Cv, tôi muốn chuyển đổi hai hình ảnh src và dst. Tôi đang sử dụng cv::estimateRigidTransform() để tính ma trận chuyển đổi và sau đó sử dụng cv::warpAffine() để chuyển đổi từ dst sang src. khi tôi so sánh hình ảnh được chuyển đổi mới với hình ảnh src, nó gần như giống nhau (được chuyển đổi), nhưng khi tôi nhận được sự khác biệt về hình ảnh chuyển đổi mới và hình ảnh src, có rất nhiều sự khác biệt. Tôi nên làm gì vì hình ảnh dst của tôi cũng có một số yếu tố dịch và xoay. đây là mã của tôiOpencv Transform Image

cv::Mat transformMat = cv::estimateRigidTransform(src, dst, true); 
cv::Mat output; 
cv::Size dsize = leftImageMat.size(); //This specifies the output image size--change needed 
cv::warpAffine(src, output, transformMat, dsize); 

Src ảnh

enter image description here

đích của hình ảnh

enter image description here

hình ảnh đầu ra

enter image description here

tuyệt đối khác biệt hình ảnh

enter image description here

Cảm ơn

+0

Trước hết, bạn muốn đạt được chính xác những gì? Tất nhiên, khi thực hiện một số biến đổi chung, abs-diff sẽ khác không. Thậm chí thay đổi xoay vòng 1 độ cũng sẽ gây ra những thay đổi lớn do nội suy pixel. – jnovacho

+0

Xin chào, jnovacho, tôi muốn chỉnh sửa hình ảnh bằng cách sử dụng opencv – Mudasar

+0

Tôi vẫn không thấy sự cố. Mã của bạn có vẻ ổn với tôi. Bạn có thể cung cấp một số ảnh chụp màn hình - hình ảnh nguồn và đích cũng như hình ảnh đầu ra không. – jnovacho

Trả lời

4

Bạn có một số quan niệm sai lầm về quá trình này.

Phương thức cv :: estimRigidTransform lấy làm hai bộ điểm tương ứng. Và sau đó giải quyết các phương trình để tìm ma trận biến đổi. Đầu ra của phép biến đổi khớp với điểm src thành điểm dst (chính xác hoặc chặt chẽ, nếu không thể khớp chính xác - ví dụ như tọa độ nổi).

Nếu bạn áp dụng ước lượngRigidTransform trên hai hình ảnh, trước tiên OpenCV tìm các cặp điểm phù hợp sử dụng một số phương pháp nội bộ (xem opencv docs).

cv :: warpAffine sau đó chuyển đổi hình ảnh src thành dst theo ma trận chuyển đổi đã cho. Nhưng bất kỳ (hầu như bất kỳ) chuyển đổi là hoạt động mất mát. Thuật toán phải ước tính một số dữ liệu, vì chúng không có sẵn. Quá trình này được gọi là nội suy, sử dụng thông tin đã biết mà bạn tính giá trị không xác định. Bạn có thể tìm thấy một số thông tin về chia tỷ lệ hình ảnh trên wiki. Các quy tắc tương tự áp dụng cho các phép biến đổi khác - xoay vòng, nghiêng, phối cảnh ... Rõ ràng điều này không áp dụng cho việc dịch.

Với hình ảnh thử nghiệm của bạn, tôi đoán rằng OpenCV sẽ chụp đèn như tham chiếu. Từ sự khác biệt rõ ràng là chụp đèn được chuyển đổi tốt nhất. Mặc định OpenCV sử dụng nội suy tuyến tính để làm cong vênh vì nó là phương pháp nhanh nhất. Nhưng bạn có thể đặt nhiều phương thức nâng cao hơn để có kết quả tốt hơn - hãy tham khảo lại opencv docs.

Kết luận: Kết quả bạn nhận được khá tốt, nếu bạn lưu ý, đó là kết quả của quá trình tự động. Nếu bạn muốn có kết quả tốt hơn, bạn sẽ phải tìm một phương pháp khác để chọn các điểm tương ứng. Hoặc sử dụng phương pháp nội suy tốt hơn. Dù bằng cách nào, sau khi biến đổi, sự khác biệt sẽ không là 0. Nó hầu như không thể đạt được điều đó, bởi vì bitmap là lưới riêng biệt của các điểm ảnh, do đó sẽ luôn có một số khoảng trống cần được ước tính.

+0

Ok cảm ơn :) cho lời giải thích – Mudasar

+0

Xin chào jnovacho, bạn có thể cho tôi biết cách đặt xoay vòng về giữa trước khi áp dụng các sợi dọc, thực sự nó xoay nó từ góc trên bên trái trong khi ở hình ảnh âm thanh nổi phần lớn thời gian quay là từ trung tâm. Cảm ơn – Mudasar

+1

Xin chào, có sự bắt kịp. Tất cả sự biến đổi đều liên quan đến nguồn gốc [0,0]. Vì vậy, thủ thuật ở đây là dịch trung tâm mong muốn xuất xứ, quay vòng và dịch ngược lại. Một số thông tin về ma trận biến đổi là ở đây http://www.willamette.edu/~gorr/classes/GeneralGraphics/Transforms/transforms2d.htm Nhưng tôi không nghĩ rằng điều này sẽ làm việc trong OpenCV, vì bạn sẽ bị mất dữ liệu trong tọa độ âm. Thêm vào đó tôi không nghĩ rằng bạn thực sự cần điều này. Các hàm xử lý vấn đề này trong nội bộ, nó biến đổi hình ảnh để các điểm tương ứng khớp nhau. – jnovacho