2011-12-29 44 views
5

Tôi đang cố gắng tìm một thư viện tầm nhìn dễ sử dụng cho C++. Dưới đây là tình hình của tôi: Tôi có một camera giao tiếp với máy tính (vì đơn giản, tuy nhiên, chúng ta có thể chỉ là giả định rằng tập tin hình ảnh tồn tại trên máy tính) và đây là những gì những hình ảnh lý tưởng sẽ trông giống như:Thư viện hình ảnh C++ OpenCV có phù hợp với trường hợp phân đoạn hình ảnh này không?

enter image description here

Ý tưởng là ba đối tượng theo chiều dọc xếp chồng lên nhau sẽ có màu sắc tương phản cao. Tôi cần phải xác định vị trí của các đối tượng, vì vậy thư viện thị giác sẽ phải tìm các cạnh của đối tượng hoặc xác định khối lượng trung tâm của chúng.

Tôi chưa bao giờ sử dụng hệ thống thị giác trước đây và vì vậy tôi đã thực hiện một số nghiên cứu và có vẻ như OpenCV khá phổ biến. Nó có dễ sử dụng cho ứng dụng của tôi không, hoặc có thư viện nào khác có thể được sử dụng để xác định vị trí của các đối tượng dễ dàng không?

Cảm ơn lời khuyên của bạn!

Trả lời

4

Đối với hình ảnh đặc biệt này, bạn không cần phải làm việc trong không gian đầy đủ màu sắc, nhưng thay vào đó có thể làm việc một mình cường độ (chữ "V" một phần của HSV - "giá trị", nghĩa là cường độ).

enter image description here

Cho dù bạn sử dụng không gian giá trị gia tăng hoặc không gian Huế, như Penelope đã đề cập, sẽ phụ thuộc vào những hình ảnh tự nhiên bạn sản xuất cho các đối tượng thực sự của bạn. Đối với trường hợp chung, bạn có thể cần phải sử dụng kết hợp màu sắc và giá trị (cường độ) để phân đoạn hình ảnh đúng cách. Thay vì làm việc trong không gian vector giá trị màu, nó đơn giản hơn để làm việc trong các máy bay hình ảnh H và V một cách riêng biệt và sau đó kết hợp các kết quả. (Phân đoạn trong không gian vector 3D là chắc chắn có thể, nhưng có lẽ sẽ phức tạp không cần thiết cho dự án này.)

Thuật toán lưu trữ trong OpenCV có thể phù hợp với nhu cầu của bạn.

Một lời cảnh báo về phương pháp của Otsu: tốt cho việc tách hai chế độ khi biểu đồ giá trị cường độ (hoặc giá trị màu) là phân phối hai mặt, nhưng đối với hình ảnh tự nhiên thì không phổ biến. Nếu các đối tượng nền và/hoặc tiền cảnh thay đổi về cường độ và/hoặc màu sắc từ một phía của vật thể này sang vật thể khác, thì Otsu có thể hoạt động kém.

Otsu chắc chắn có thể được mở rộng cho nhiều chế độ, như được giải thích trong Xử lý hình ảnh kỹ thuật số bởi Gonzalez và Woods và các sách giáo khoa giới thiệu khác về chủ đề này. Tuy nhiên, một gradient nền sẽ gây ra vấn đề ngay cả khi bạn sử dụng Otsu để tách riêng một cặp chế độ tại một thời điểm.

Bạn cũng muốn đảm bảo rằng nếu ống kính máy ảnh của bạn phóng to hoặc thu nhỏ, bạn vẫn sẽ tìm thấy các ngưỡng binarization giống nhau. Kỹ thuật Otsu cơ bản sử dụng tất cả các pixel trong biểu đồ hình ảnh. Điều đó có nghĩa là bạn có thể tranh giành tất cả các điểm ảnh trong hình ảnh để tạo ra tiếng ồn thuần túy với cùng một biểu đồ hình ảnh như hình ảnh gốc của bạn, và phương pháp của Otsu sẽ tạo ra cùng một ngưỡng.

Một mẹo thông thường là dựa vào pixel gần các cạnh. Trong ví dụ của bạn, chúng ta có thể xem xét một hình ảnh là một khu vực có các cạnh sắc nét, các góc nhọn và (hy vọng) các giá trị HSV thống nhất. Các điểm lấy mẫu gần các cạnh có thể được thực hiện theo nhiều cách, bao gồm các cách sau:

  1. Tìm điểm cạnh mạnh (sử dụng kỹ thuật đơn giản hoặc kỹ thuật đơn giản). Dọc theo hướng của gradient cạnh, và ở khoảng cách +/- D từ điểm cạnh, lấy mẫu các mức màu xám của nền tương đối (tương đối) và nền (tương đối). Khoảng cách D sẽ nhỏ hơn nhiều so với kích thước của các đối tượng được đề cập.
  2. Tìm điểm cạnh mạnh. Sử dụng các cấp độ màu xám ở cạnh điểm tự như ước tính của ngưỡng mong muốn có khả năng. Trong ví dụ của bạn, bạn sẽ cạnh với hai đỉnh mạnh: một ở cạnh giữa object1 và object2, và cái kia ở cạnh giữa object2 và object3.

Vì đối tượng của bạn có góc, bạn có thể sử dụng các đối tượng đó để giúp xác định ranh giới đối tượng và/hoặc cạnh pixel phù hợp để lấy mẫu.

Nếu bạn có các đối tượng hình chữ nhật danh nghĩa, bạn cũng có thể sử dụng thuật toán cạnh Hough hoặc RANSAC để xác định các đường trong hình ảnh, tìm nút giao ở các góc, v.v.

Tất cả những gì đã nói, trong gần bất kỳ hình ảnh tự nhiên liên quan đến đối tượng xếp chồng lên nhau bạn sẽ chạy vào một số biến chứng:

  • Shadows
  • Màu sắc và cường độ gradient trên một đối tượng của danh nghĩa màu phù hợp
  • Edges độ sắc nét khác nhau nếu đối tượng là một khoảng cách khác nhau từ hệ thống quang

Nếu bạn biết có bao nhiêu đối tượng nhất định Hiện tại, bạn có thể thử một kỹ thuật K Phương tiện. http://aishack.in/tutorials/knearest-neighbors-in-opencv/

Đối với nhiệm vụ phân chia phức tạp hơn, chẳng hạn như khi số lượng đối tượng không được biết, bạn có thể sử dụng Mean phím Shift kỹ thuật, mặc dù tôi khuyên bạn nên cố gắng kỹ thuật đơn giản đầu tiên.

Bước đầu tiên và sửa chữa dễ dàng nhất là sử dụng ánh sáng phù hợp. Để giảm phản xạ và bóng tối, hãy sử dụng ánh sáng khuếch tán. Đối với nhiều ứng dụng, ánh sáng khuếch tán lý tưởng nhất là ánh sáng "có mây": http://www.microscan.com/en-us/products/nerlite-machine-vision-lighting/cdi-illuminators.aspx

Đơn giản hơn, bạn có thể thử một hoặc nhiều đèn "thoát" như được sử dụng trong chụp ảnh trong studio. http://www.photography.com/articles/taking-photos/bounce-lighting/

7

OpenCV chắc chắn là một thư viện tầm nhìn dễ sử dụng. Tôi đã sử dụng nó trong một vài dự án tầm nhìn máy tính và với tôi nó khá trực quan để sử dụng.

Tôi giả sử rằng màu của đối tượng không xác định (nếu không, here's hướng dẫn khá tốt về cách tìm màu cụ thể trong OpenCV).

Dưới đây là một ý tưởng thô để giải quyết vấn đề của bạn (tôi nghĩ dọc theo dòng của những gì hoạt động là dễ thực hiện trong OpenCV):

  • chuyển đổi hình ảnh thành HSV vùng màu - màu sắc nên có rất giá trị Huế khác nhau trong không gian này nếu họ có độ tương phản cao, vì vậy chỉ sử dụng các hình ảnh Huế

  • ngưỡng những hình ảnh sử dụng phương pháp Otsu của (ngưỡng sẽ được xác định tự động)

  • nếu nó p icks ra đối tượng ở giữa (ví dụ: có 2 thành phần được kết nối trên nền) phân đoạn được thực hiện. Bạn có thể sử dụng findContours hoặc thậm chí Hough chuyển đổi cho các dòng nếu các đối tượng có hình vuông.

  • nếu chỉ chọn đối tượng ngoài, bạn có thể tìm lại đường viền theo cùng một cách, đặt Khu vực quan tâm (một phần của ảnh bạn đang làm việc) để nó nằm bên trong đường nét và ngưỡng bên trong một phần của hình ảnh một lần nữa để tìm đường viền giữa hai đối tượng kia. Cuối cùng, chỉ cần chồng các đường nét được tìm thấy trên một hình ảnh riêng biệt.

  • trường hợp khó khăn nhất là nếu nó ngưỡng để bạn chỉ tìm thấy đối tượng bên trong nhất. ngay từ cái nhìn đầu tiên, bạn không thể phân biệt được điều đó với trường hợp trên, nhưng lần thứ hai (bên trong) thresholding sẽ không đưa ra bất kỳ kết quả nào có liên quan. Trong trường hợp đó, bạn có thể chọn một Hue ngay bên ngoài khu vực ngưỡng tìm thấy (Hue của đối tượng thứ hai), và đặt Hue của đối tượng trong cùng (chỉ tìm thấy) vào đó. Bây giờ, bạn sẽ có được một bức tranh 2-Hue một lần nữa, bạn có thể ngưỡng và tìm đường nét giữa hai đối tượng bên ngoài. Cuối cùng, giống như trong trường hợp trước, chồng lên các đường nét đã tìm thấy.

+0

"màu sắc nên có giá trị Huế rất khác nhau trong không gian này" Mẹo hữu ích, tôi "sẽ nhớ điều đó. – SigTerm

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