2012-08-28 52 views
7

Xin chào Tôi đang cố gắng thực hiện một số xử lý hình ảnh. Tôi sử dụng Microsoft Kinect để phát hiện con người trên một căn phòng. Tôi có được dữ liệu chiều sâu, làm một số công việc nền trừ và kết thúc với một chuỗi video như thế này khi một người đi vào hiện trường và đi xung quanh:Tôi làm cách nào để xóa nhiễu khỏi chuỗi video này?

http://www.screenr.com/h7f8

tôi đặt một đoạn video để bạn có thể nhìn thấy hành vi của tiếng ồn trong video. Các màu khác nhau thể hiện các mức độ sâu khác nhau. Màu trắng biểu thị trống. Như bạn thấy nó khá ồn ào, đặc biệt là tiếng ồn đỏ.

Tôi cần loại bỏ mọi thứ ngoại trừ con người càng nhiều càng tốt. Khi tôi làm xói mòn/giãn nở (sử dụng kích thước cửa sổ rất lớn), tôi có thể loại bỏ được rất nhiều tiếng ồn nhưng tôi tự hỏi liệu có phương pháp nào khác mà tôi có thể sử dụng hay không. Đặc biệt là tiếng ồn màu đỏ trong video khó loại bỏ bằng cách sử dụng xói mòn/giãn nở.

Một số lưu ý:

1) Một phép trừ nền tốt hơn có thể được thực hiện nếu chúng ta biết khi không có người trong cảnh nhưng trừ nền chúng tôi làm là hoàn toàn tự động và nó hoạt động ngay cả khi có những con người trong cảnh và ngay cả khi máy ảnh được di chuyển, vv vì vậy đây là phép trừ nền tốt nhất mà chúng tôi có thể nhận ngay bây giờ.

2) Thuật toán sẽ hoạt động trên hệ thống nhúng, thời gian thực. Vì vậy, thuật toán càng hiệu quả và dễ dàng càng tốt. Và nó không phải là hoàn hảo. Mặc dù các kỹ thuật xử lý tín hiệu phức tạp cũng được chào đón (có thể chúng ta có thể sử dụng chúng trên một dự án khác không cần nhúng, xử lý thời gian thực).

3) Tôi không cần mã thực. Chỉ là ý tưởng.

+0

Biết thêm về phép trừ nền có thể hữu ích; tức là tại sao có tiếng ồn trong hình ảnh? – jpa

+0

Bạn đang sử dụng SDK/trình điều khiển nào (ví dụ: MS Kinect SDK, OpenNI, libfreenect, v.v.)? –

Trả lời

0

Điều này khá đơn giản giả sử bạn đang sử dụng Kinect SDK. Tôi sẽ làm theo this video cho vấn đề cơ bản sâu, và làm điều gì đó như thế này:

private byte[] GenerateColoredBytes(DepthImageFrame depthFrame) 
    { 

     //get the raw data from kinect with the depth for every pixel 
     short[] rawDepthData = new short[depthFrame.PixelDataLength]; 
     depthFrame.CopyPixelDataTo(rawDepthData); 

     //use depthFrame to create the image to display on-screen 
     //depthFrame contains color information for all pixels in image 
     //Height x Width x 4 (Red, Green, Blue, empty byte) 
     Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4]; 

     //Bgr32 - Blue, Green, Red, empty byte 
     //Bgra32 - Blue, Green, Red, transparency 
     //You must set transparency for Bgra as .NET defaults a byte to 0 = fully transparent 

     //hardcoded locations to Blue, Green, Red (BGR) index positions  
     const int BlueIndex = 0; 
     const int GreenIndex = 1; 
     const int RedIndex = 2; 


     //loop through all distances 
     //pick a RGB color based on distance 
     for (int depthIndex = 0, colorIndex = 0; 
      depthIndex < rawDepthData.Length && colorIndex < pixels.Length; 
      depthIndex++, colorIndex += 4) 
     { 
      //get the player (requires skeleton tracking enabled for values) 
      int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask; 

      //gets the depth value 
      int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth; 

      //.9M or 2.95' 
      if (depth <= 900) 
      { 
       //we are very close 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 
      // .9M - 2M or 2.95' - 6.56' 
      else if (depth > 900 && depth < 2000) 
      { 
       //we are a bit further away 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 
      // 2M+ or 6.56'+ 
      else if (depth > 2000) 
      { 
       //we are the farthest 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 


      ////equal coloring for monochromatic histogram 
      //byte intensity = CalculateIntensityFromDepth(depth); 
      //pixels[colorIndex + BlueIndex] = intensity; 
      //pixels[colorIndex + GreenIndex] = intensity; 
      //pixels[colorIndex + RedIndex] = intensity; 


      //Color all players "gold" 
      if (player > 0) 
      { 
       pixels[colorIndex + BlueIndex] = Colors.Gold.B; 
       pixels[colorIndex + GreenIndex] = Colors.Gold.G; 
       pixels[colorIndex + RedIndex] = Colors.Gold.R; 
      } 

     } 


     return pixels; 
    } 

này biến tất cả mọi thứ trừ người da trắng, và con người là vàng. Hi vọng điêu nay co ich!

EDIT

Tôi biết bạn không nhất thiết muốn mã chỉ ý tưởng, vì vậy tôi sẽ nói tìm một thuật toán phát hiện chiều sâu, và một trong đó phát hiện số lượng con người, và tất cả mọi thứ màu trắng ngoại trừ con người. Tôi đã cung cấp tất cả những điều này, nhưng tôi không biết nếu bạn biết những gì đang xảy ra. Ngoài ra tôi có một hình ảnh của chương trình cuối cùng.

image1

Lưu ý: tôi đã thêm khung sâu thứ hai cho quan điểm

0

Tôi có thể sai (tôi cần các video mà không cần xử lý cho điều đó) nhưng tôi muốn có xu hướng để nói rằng bạn đang cố gắng loại bỏ các thay đổi chiếu sáng.

Đây là điều khiến mọi người phát hiện khó khăn trong môi trường 'thực tế'.

Bạn có thể xem this other SO question đối với một số liên kết.

Tôi đã sử dụng để phát hiện thời gian thực của con người trong cùng một cấu hình so với bạn, nhưng với tầm nhìn một mắt. Trong trường hợp của tôi, một mô tả thực sự tốt là LBPs, mà chủ yếu được sử dụng để phân loại kết cấu. Điều này khá đơn giản để đưa vào thực tế (có các triển khai trên toàn bộ web).

LBP được sử dụng cơ bản để xác định khu vực quan tâm nơi phát hiện chuyển động, để tôi chỉ có thể xử lý một phần của hình ảnh và loại bỏ tất cả nhiễu đó.

Ví dụ này sử dụng LBP để điều chỉnh thang độ xám của hình ảnh.

Hy vọng rằng sẽ mang lại một số ý tưởng mới.

2

Chỉ cần tôi hai xu:

Nếu bạn không nhớ bằng cách sử dụng SDK cho rằng, sau đó bạn có thể dễ dàng giữ chỉ các điểm ảnh người sử dụng PlayerIndexBitmask như Outlaw Lemur lãm.

Bây giờ bạn có thể không muốn phụ thuộc vào các trình điều khiển cho điều đó và muốn làm điều đó ở cấp xử lý hình ảnh. Một cách tiếp cận mà chúng tôi đã thử trong một dự án và làm việc khá tốt là đường viền dựa trên. Chúng tôi bắt đầu bằng phép trừ nền và sau đó chúng tôi phát hiện đường viền lớn nhất trong ảnh giả định rằng đây là người (vì thường là tiếng ồn vẫn còn rất nhỏ) và chúng tôi lấp đầy đường viền đó và giữ nó. Bạn cũng có thể sử dụng một số loại lọc trung bình như một lần đầu tiên.

Tất nhiên, điều này không hoàn hảo và không phù hợp trong mọi trường hợp và có thể có nhiều phương pháp tốt hơn. Nhưng tôi chỉ ném nó ra có trong trường hợp nó giúp bạn đưa ra bất kỳ ý tưởng.

+0

+1 Điều này có thể áp dụng cho bất kỳ ngôn ngữ/nguồn nào –

1

Hãy xem qua số eyesweb.

Đây là nền tảng để thiết kế hỗ trợ thiết bị kinect và bạn có thể áp dụng bộ lọc nhiễu trên đầu ra. Nó là một công cụ rất hữu ích và đơn giản để thiết kế hệ thống multimodal.

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