2009-07-31 8 views
8

Tôi có một hình ảnh, được chụp từ webcam trực tiếp và tôi muốn có thể phát hiện một đối tượng cụ thể trong hình ảnh và trích xuất phần đó để thực hiện thêm một số thao tác.Phát hiện một đối tượng trong hình ảnh camera trong C#

Cụ thể, hình ảnh sẽ là một bảng trò chơi, giả sử cho mục đích của câu hỏi này là bảng trò chơi Sudoku. Đây là sample image. Cách tiếp cận ban đầu của tôi là tìm kiếm các khu vực tương phản và làm việc từ đó, nhưng tôi dường như kết thúc với rất nhiều các cạnh tiềm năng (nhiều sai lầm) và không có đầu mối thực sự nào về cách tìm ra cái nào là những người tôi thực sự muốn!

Có bất kỳ thuật toán, thư viện, mẫu mã hay thậm chí chỉ là những ý tưởng sáng chói ở đó, về cách tôi tìm hiểu và trích xuất phần có liên quan của hình ảnh?

Trả lời

8

sử dụng miễn phí AForge.Net thư viện xử lý hình ảnh cho việc này. có rất nhiều thứ thú vị để chơi cùng.

+6

Chỉ vì ai đó cung cấp cho bạn búa không có nghĩa là bạn có thể xây nhà. Có công cụ hữu ích nhưng bạn phải biết bạn sẽ làm gì với công cụ này. –

3

Bạn cần thực hiện thao tác bộ lọc và mặt nạ trên hình ảnh.

Tôi nghĩ không có cách nào đơn giản để chỉ lấy đối tượng từ hình ảnh, bạn cần sử dụng các thuật toán phát hiện cạnh, cắt và đặt tiêu chí cho đối tượng/hình ảnh hợp lệ.

Bạn cũng có thể sử dụng hình ảnh thresholding để phát hiện đối tượng. Đây là article and algorithm từ Stanford Uni.

Bạn có thể muốn xem bên dưới Thư viện xử lý hình ảnh.

  1. Filters API cho C, C++, C#, Visual Basic.NET, Delphi, Python
  2. http://www.catenary.com/
  3. CIMG giàu hơn thư viện ở trên tuy nhiên nó được viết bằng C++
1

Một trong những (Tôi đoán nhiều khả năng) phương pháp tiếp cận:

  1. Tìm bộ lọc "được/calc ulates "đường thẳng (cạnh, vv) từ một hình ảnh nhất định.

  2. Bây giờ bạn có bộ sưu tập (mảng) của tất cả các dòng (xStart, yStart & xEnd, yEnd). Bạn có thể dễ dàng tính toán tất cả các độ dài dòng từ các tọa độ.

  3. Bây giờ, hãy xem xét rằng bạn luôn có thể (!) Mong đợi "một hình vuông lớn nhất/hình chữ nhật" bên trong hình ảnh, sẽ rất dễ dàng để tìm và tính toán vùng mong muốn-hình chữ nhật sudoku và cắt nó từ hình ảnh để xử lý thêm.

EDIT: Giải quyết/lập trình loại vấn đề đó luôn là thách thức NHƯNG thực sự thú vị cùng một lúc :).

0

Bạn có thể thử trước tiên để tìm các điểm giao cắt đường đậm và sử dụng chúng làm điểm đăng ký.

Đây sẽ là một khởi đầu tốt vì:

  • Họ đang khá thống nhất hình
  • Bạn biết có bao nhiêu có
  • Bạn biết nơi (khoảng) họ phải ở trong mối quan hệ với nhau
  • biến quy mô có thể chịu đựng

Vì vậy:

01.
  1. Áp dụng một bộ lọc cạnh
  2. Quét một mặt nạ * những gì lý tưởng + sẽ giống như trên hình ảnh, ghi âm tất cả những gì là một trận đấu tốt
  3. Chọn các thiết lập phù hợp với mong đợi của bạn tốt nhất, theo vị trí tương đối với nhau
  4. Bây giờ bạn cũng biết vị trí của các số nên bạn có thể dễ dàng trích xuất chúng.

* Một giải pháp phức tạp hơn là sử dụng Neural Net thay vì mặt nạ để nhận ra giao lộ. Điều này có thể đáng giá vì bạn có thể sẽ sử dụng một cho OCR của các con số.

+0

+1 cho ý tưởng, -1 để đề xuất một NN –

+0

Hình ảnh bị nhiễu và các mạng thần kinh xử lý dữ liệu nhiễu tốt. Đó là lý do tại sao chúng được sử dụng trong OCR. Điều đó nói rằng, tôi thích đề xuất phát hiện Harris của bạn ... có thể là một đầu vào cho một NN? ;-) – pufferfish

3

Đây là tính năng của Coding4Fun blog entry mà bạn có thể thấy hữu ích. Điều này cũng có nghĩa là một cuộc bỏ phiếu thứ hai cho thư viện AForge, vì tác giả sử dụng nó trong ví dụ.

1

Tôi sẽ bắt đầu bằng cách sử dụng thiết bị dò góc (Máy dò hạt Harris hoạt động tốt) để tìm các nút giao và góc của lưới sudoku.

Sau đó, tôi sẽ sử dụng các điểm đó để thực hiện chỉnh sửa hình ảnh để biến đổi hình ảnh để lưới có hình chữ nhật càng tốt. Bây giờ bạn sẽ không gặp khó khăn khi tìm mỗi ô vuông để thực hiện OCR.

Chỉnh sửa hình ảnh không đơn giản và đòi hỏi khá nhiều toán.

Hãy chuẩn bị để làm một số đọc :)

Nếu những hình ảnh của bảng trò chơi đã gần thành hình chữ nhật, bạn có thể bỏ qua tất nhiên phần cải chính và trực tiếp sử dụng các điểm góc để tìm hình vuông của bạn cho OCR.

Rất nhiều người đã đề xuất sử dụng mạng thần kinh. Tôi khá chắc chắn rằng việc ném mạng thần kinh vào vấn đề này là hoàn toàn không cần thiết. NNs (đôi khi) tốt nếu bạn cần phân loại các đối tượng mà định nghĩa của đối tượng là mơ hồ. "Tìm xe trong hình ảnh" là một vấn đề có thể sử dụng cho mạng thần kinh vì xe hơi trông rất khác nhau nhưng có một số tính năng giống nhau. Vì vậy, với đủ dữ liệu, bạn có thể đào tạo NN của bạn để phát hiện xe hơi. Trong vấn đề này bạn có một cái gì đó rất thường xuyên và luôn luôn trông gần như giống nhau, do đó, một NN sẽ không làm cho bất cứ điều gì dễ dàng hơn hoặc tốt hơn.

+0

+1 cho "Hãy chuẩn bị để đọc một số :)" – Niki

0

Không từ chối bất kỳ ý tưởng nào khác, bước 1 thực sự phải là phát hiện xoay hình ảnh. Bạn có thể làm điều này bằng cách xác định gradient cục bộ tại mỗi điểm và tạo một biểu đồ của chúng. Điều này sẽ có 4 thành phần chính ở độ lệch 90 độ.Lý tưởng nhất, chúng sẽ là 0, 90, 180 và 270 nhưng nếu chúng không phải là bạn nên xoay hình ảnh của bạn. Ví dụ. trong hình ảnh mẫu bạn nên bắt đầu với một vòng quay trên khoảng 8 độ CW.

1

Sử dụng colorfiltering aforge

Có rất nhiều phương pháp lọc cung cấp cho C#, chủ yếu là tôi thích bộ lọc aforge, cho mục đích này họ có vài bộ lọc, họ

* ColorFiltering 
* ChannelFiltering 
* HSLFiltering 
* YCbCrFiltering 
* EuclideanColorFiltering 

See here

0

Bạn nên google cho CamShift hoặc Theo dõi Blob hoặc Bộ lọc hạt. Họ là tất cả hữu ích cho vấn đề của bạn. Và hầu hết chúng được vận chuyển với OpenCV và nó là C# wrapper AForge.NET. Bạn sẽ tìm thấy một số bản trình diễn hay trên Youtube cho thấy cách họ làm việc.

Chúc may mắn