2012-04-30 35 views
8

Tôi đang phát xung quanh với Kinect SDK v1.0.3.190 mới. (câu hỏi liên quan khác trong stackoverflow là trên sdk trước của kinect) Tôi nhận được chiều sâu và màu sắc suối từ Kinect. Khi các luồng độ sâu và RGB được chụp với các cảm biến khác nhau, có một sự lệch giữa hai khung hình như có thể thấy bên dưới.Chiều sâu Kinect và Khung ảnh Alignment

Chỉ RGB RGB

Chỉ Depth Depth

Depth & RGB RGB & Depth equally blended

tôi cần phải sắp xếp chúng và có một hàm có tên MapDepthToColorImagePoint chính xác cho mục đích này. Tuy nhiên nó dường như không hoạt động. đây là một không kém pha trộn (chiều sâu và ánh xạ màu) cho kết quả dưới đây được tạo ra với đoạn mã sau

  Parallel.For(0, this.depthFrameData.Length, i => 
     { 
      int depthVal = this.depthFrameData[i] >> 3; 
      ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i/640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30); 
      int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4)); 

      this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex])); 
      this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1])); 
      this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2])); 
     }); 

nơi

depthFrameData -> raw depth data (short array) 

videoBitmapData -> raw image data (byte array) 

mappedBitmapData -> expected result data (byte array) 

thứ tự của các thông số, độ phân giải, kích thước mảng là chính xác (hai lần kiểm tra) .

Kết quả của mã này là: depth and MapDepthToColorImagePoint

Các lệch chi tiết tiếp tục! Thậm chí còn tệ hơn nữa, hình ảnh kết quả sau khi sử dụng MapDepthToColorImagePoint hoàn toàn giống với hình ảnh gốc.

Sẽ được đánh giá cao nếu ai đó có thể giúp tôi tìm ra lỗi của mình hoặc ít nhất là giải thích cho tôi MapDepthToColorImagePoint là gì (giả sử rằng tôi đã hiểu sai chức năng của nó)?

Trả lời

1

Đây là một vấn đề rất phổ biến, một cái gì đó vốn có trong toán học liên quan đến đồng bộ hóa hai hình ảnh kể từ khi hai máy ảnh đang ngồi ở hai nơi khác nhau. Giống như lấy hai nguồn cấp dữ liệu video được tạo ra bởi máy ảnh 3D và cố gắng đồng bộ hóa chúng. Họ sẽ luôn luôn được tắt một chút.

Hai ý tưởng cho sửa chữa:

  1. thủ chuyển các bit từ hình ảnh sâu như bạn tính toán nó.
  2. Thêm một động cơ shaker với Kinect để giảm tiếng ồn: http://www.youtube.com/watch?v=CSBDY0RuhS4 (Tôi đã tìm thấy một động cơ máy nhắn tin đơn giản để có hiệu quả.)

Các MapDepthToColorImagePoint là để sử dụng trong các API xương để ánh xạ một điểm xương để một điểm sâu và sau đó đến một điểm ảnh để bạn có thể hiển thị các khớp trên đỉnh của hình ảnh RGB.

Hy vọng điều này sẽ hữu ích.

4

Điều này sẽ luôn xảy ra một chút vì hai cảm biến được gắn ở các vị trí hơi khác nhau.

Hãy thử:

Nhìn vào một vật bằng hai mắt, sau đó thử chỉ sử dụng mắt trái, sau đó chỉ dùng mắt phải. Mọi thứ trông hơi khác một chút vì hai mắt của bạn không ở cùng một nơi.

Tuy nhiên: có thể khắc phục được nhiều vấn đề với một số mã API.

Tôi đang sử dụng Kinect cho Windows 1.5, do đó, API hơi khác so với 1.0.

short[] depth=new short[320*240]; 
// fill depth with the kinect data 
ColorImagePoint[] colorPoints=new ColorImagePoint[320*240]; 
// convert mappings 
kinect.MapDepthFrameToColorFrame(DepthImageFormat.Resolution320x240Fps30, 
      depth, ColorImageFormat.RgbResolution640x480Fps30, colorPoints); 
// now do something with it 
for(int i=0;i<320*240;i++) 
{ 
    if (we_want_to_display(depth[i])) 
    { 
    draw_on_image_at(colorPoints[i].X,colorPoints[i].Y); 
    } 
} 

Đó là những điều cơ bản. Nếu bạn nhìn vào ví dụ màn hình xanh trong Bộ công cụ phát triển Kinect 1.5, nó cho thấy một cách sử dụng tốt cho việc này.

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