2011-01-18 159 views
5

Làm cách nào để tạo hình ảnh lập thể 3D từ hình ảnh 2D bằng MATLAB?Làm thế nào để tạo hình ảnh 3D bằng cách sử dụng MATLAB với công cụ hình ảnh?

+3

Câu hỏi là gì? Bạn đã thử cái gì? – carlosdc

+1

Tôi nghĩ sẽ dễ dàng hơn nếu tạo dữ liệu 3D, vì tất cả những gì bạn cần là tạo 2 phép chiếu với các góc nhìn khác nhau. –

+0

@carlosdc @Itamar Katz: nếu tôi muốn xem hình ảnh 2D sử dụng kính 3D, nó được xem thành định dạng hình ảnh 3D .. như thế này. Hoặc bất kỳ cách nào khác có thể nhìn thấy nó với 3 chiều? –

Trả lời

11

Hoặc là tôi hiểu nhầm câu hỏi của bạn (mọi người đã chỉ ra rằng nó không rõ ràng), hoặc bạn hiểu nhầm cách thức hoạt động của 3D vision. Bạn không "nhìn thấy hình ảnh 2D bằng kính 3D". Tầm nhìn 3D đạt được bằng cách phục vụ hai hình ảnh khác nhau, hình ảnh bên trái và hình ảnh bên phải, tương ứng với mắt trái và mắt phải. Tại một mức độ cơ bản MATLAB không có bất cứ điều gì để làm với nó. Vì vậy, trong trường hợp không có một câu hỏi dễ hiểu hoặc mạch lạc, tốt nhất tôi có thể làm là giả sử bạn muốn một cái gì đó như this: bạn có một hình ảnh 2D, nhưng bạn vẫn muốn "nhìn vào định dạng hình ảnh 3d". Trong trường hợp đó, bạn cần phải bằng cách nào đó chia rằng hình ảnh duy nhất vào hai hình ảnh mới:

  1. hình ảnh trái cho mắt trái
  2. Hình bên phải cho mắt phải

Đây không phải là tầm thường. Nói chung, bạn bắt đầu bằng inferring the depth của mỗi pixel trong hình ảnh 2D. Vì bạn đang "đoán" thông tin về chiều sâu, hai hình ảnh mới sẽ không phải là một đại diện hoàn hảo của cảnh 3D.

Tiếp theo, bạn tách hình ảnh của mình thành các lớp bằng thông tin độ sâu đó. Đó là bản chất sẽ trông giống như một cutout pop-up từ cuốn sách dành cho trẻ em:

alt text

Các lớp hơn bạn có thể nghĩ ra, và chính xác hơn ước tính chiều sâu của bạn là, thực tế hơn đại diện 3D của bạn sẽ được .

Cuối cùng, bạn chiếu lớp đại diện đó trở lại 2D từ hai vị trí khác nhau - một cho mắt trái và một cho mắt phải. Điều này cung cấp cho bạn hai hình ảnh khác nhau mà bạn cần.

EDIT

Thứ hai video bạn liên kết với mô tả việc tạo đơn giản về những gì thường được gọi là một anaglyph image. Nó đòi hỏi kính 3D-cyan 3D - đây là không phải kính phân cực mà họ sử dụng trong hầu hết các rạp chiếu phim 3D ngay bây giờ. Lý do tôi nói đơn giản hóa là nó không phân biệt đối xử giữa nền trước và nền sau.

Để có hiệu quả tốt nhất, bạn sẽ tách nền trước ra khỏi nền và áp dụng cách tiếp cận chỉ cho nền trước. Điều này là do nền thường có chiều sâu vô hạn và không thay đổi khi đi từ mono sang tầm nhìn stereo. Trong trường hợp của piano, mọi thứ đều ít nhiều tiền cảnh, vì vậy cách tiếp cận này hoạt động.

Thuật toán video mô tả là:

  • Bắt đầu với hai hình ảnh, im1im2. Chúng giống hệt nhau
  • Đặt các kênh màu lục và màu xanh dương là im1 thành 0. Điều này sẽ tạo ra hình ảnh màu đỏ
  • Đặt kênh màu đỏ là im2 thành 0. Điều này sẽ tạo ra hình ảnh lục lam.
  • Bù đắp hai hình ảnh theo một số lượng được chỉ định (tùy thuộc vào độ sâu đối tượng) sao cho im1 ở bên trái và im2 ở bên phải. Bạn cần phải nhận đơn đặt hàng này một cách chính xác vì kính 3D-cyan 3D có màu đỏ ở bên trái và màu lục lam ở bên phải.
  • Thực hiện bổ sung yếu tố khôn ngoan cho hai hình ảnh được dịch chuyển. Lưu ý rằng không có kênh nào sẽ bão hòa.

Dưới đây là một số Python/code OpenCV tôi đã viết:

import cv 
SHIFT=8 

if __name__ == '__main__': 
    import sys 
    _, fname = sys.argv 
    im = cv.LoadImage(fname) 

    size = cv.GetSize(im) 
    width, height = size 
    left = cv.CreateImage(size, im.depth, im.nChannels) 
    right = cv.CreateImage(size, im.depth, im.nChannels) 
    anaglyph = cv.CreateImage((width - SHIFT, height), im.depth, im.nChannels) 

    # 
    # This would be easier if we had COI support for cv.Set, but it doesn't 
    # work that way. 
    # OpenCV uses BGR order (even if input image is greyscale): 
    # http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html 
    # red goes on the left, cyan on the right: 
    # http://en.wikipedia.org/wiki/Anaglyph_image 
    # 
    b = cv.CreateImage(size, im.depth, 1) 
    g = cv.CreateImage(size, im.depth, 1) 
    r = cv.CreateImage(size, im.depth, 1) 
    cv.Split(im, b, g, r, None) 

    zeros = cv.CreateImage(size, r.depth, 1) 
    cv.Merge(zeros, zeros, r, None, left) 
    cv.Merge(b, g, zeros, None, right) 

    # 
    # cvRect is (x, y, width, height) and it MUST be a tuple, not a list 
    # 
    cv.SetImageROI(left, (SHIFT, 0, width - SHIFT, height)) 
    cv.SetImageROI(right, (0,  0, width - SHIFT, height)) 
    cv.Add(left, right, anaglyph, None) 

    cv.SaveImage('anaglyph.jpeg', anaglyph) 

Dưới đây là một hình ảnh tương tự như những gì đang sử dụng trong video:

alt text

Dưới đây là kết quả:

alt text

Thật không may là tôi không có kính 3D-cyan 3D để xác minh rằng nó hoạt động. Nhưng có vẻ như nó nên, ít nhất là trong lý thuyết. Có lẽ ai đó có thể sửa tôi nếu tôi mắc lỗi.

+0

cảm ơn rất nhiều @misha .. nhưng tôi muốn thấy các liên kết video http://www.youtube.com/watch?v=3r4M_KHt6aw, http://www.youtube.com/watch?v=g_JRHtHpuSY, http : //www.youtube.com/watch? v = zdXxS2KHXlo như thế .. - cảm ơn Abhi. –

+1

Về cơ bản, liên kết đầu tiên mô tả khá nhiều những gì tôi đã làm. Tính toán độ sâu bản đồ, làm cho hình ảnh thứ hai. Tôi không chắc chắn về việc thực hiện bộ lọc thay thế thực tế. Liên kết thứ hai không thực sự liên quan đến nhau - nó không phải là hình ảnh âm thanh nổi, nó chỉ đạt được hiệu ứng giả 3D. Nếu đây là những gì bạn muốn, sau đó nó khá đơn giản để thực hiện, chỉ cần làm chính xác như đứa trẻ đã nói trong video. Tôi có thể xem video thứ ba sau đó - nó hơi dài một chút, và đã muộn rồi. Đặt liên kết có liên quan trong câu hỏi ban đầu của bạn để làm cho nó rõ ràng những gì bạn muốn. – misha

+0

Cảm ơn @misha yes bạn nhận được. Tôi muốn thêm hiệu ứng giả 3D từ hình ảnh 2d. Tôi chỉ đạt được hiệu ứng 3D đơn giản theo các liên kết video. Nếu bạn có mã liên quan đến nó trả lời tôi .. - Abhi –

0

Thao tác này dễ dàng hơn nhiều nếu bạn có hai hình ảnh được chụp từ các góc nhìn hơi khác nhau. Bạn có thể tạo anaglyph stereo bằng cách chỉnh sửa hai hình ảnh. Các chức năng liên quan là estimateUncalibratedRectifiationstereoAnaglyph trong Hộp công cụ Hệ thống Tầm nhìn Máy tính. Xem ví dụ Uncalibrated Stereo Image Rectification.

Hoặc, bạn có thể hiệu chỉnh máy ảnh của mình bằng cách sử dụng Stereo Camera Calibrator app và sau đó sử dụng chức năng recifyStereoImages. Xem Stereo Calibration and Scene Reconstruction.

+0

cảm ơn câu trả lời của bạn .. nếu chúng tôi chỉ có một hình ảnh thì chúng ta có thể tạo ra hình ảnh lập thể không ?? –

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