Phát triển ứng dụng thu thập và xử lí hình ảnh từ Webcam bởi LabVIEW.

0
853
Phương pháp 1: Sử dụng sự hỗ trợ của thư viện liên kết động.
Nhờ vào sự hỗ trợ của hai bộ thư viện liên kết động là Avicap32.dll và user32.dll chúng ta có thể dễ dàng có được một ứng dụng thu nhận tín hiệu video hoặc chụp hình bằng LabVIEW và một webcam thông dụng.
Avicap32.dll là một thư viện liên kết động chứa đựng các hàm cơ bản hỗ trợ hệ điều hành Window trong việc chụp hình và truyền nhận tín hiệu video từ một thiết bị ngoại vi. Thư viện này được phát triển bởi Microsoft và nó là một phần của hệ điều hành. Một khi hệ điều hành được cài đặt, avicap32.dll sẽ được lưu trữ trong thư mục mặc định là C:/ Windows/ System32/ avicap32.dll.
Trong khi đó thư viện User32.dll cung cấp các hàm dùng để phát triển và quản lí màn hình window (Bố trí các icon, sắp xếp hay cấu hình kích cỡ màn hình, thanh trạng thái). Đây là một thành phần cốt lõi của hệ điều hành Window (C: Windows system 32). Nếu không có thư viện này hoặc thư viện này bị xoá, gỡ bỏ thì hệ điều hành sẽ không hoạt động.
Để thực thi việc chụp hình hay thu nhận tín hiệu từ thiết bị webcam, sau đó cho hiển thị trên front panel, trong LabVIEW chúng ta sử dụng hàm Call Library Function node gọi các hàm từ trong thư viện avicap32 và user32 ra. Cấu hình các thuộc tính cho các hàm đó.
Làm thế nào để cấu hình các thuộc tính hay còn gọn là các biến, tham số của hàm? Bởi vì các hàm trong thư viện liên kết động đều là thành phần của hệ điều hành window nên chúng ta dễ dàng tìm thấy các yêu cầu về các tham số, biến số trong website hỗ trợ của Microsoft.
Ví dụ như, để chụp hình bằng hàm capcreatecapturewindow trong thư viện avicap32.dll, chúng ta không biết được cấu trúc của hàm này, khi đó ta vào địa chỉ website hỗ trợ của Microsoft cho hàm này ta sẽ có được các thông tin đó.

Nội dung cấu trúc của hàm capcreatecaptureWindow trong thư viện Microsoft (Trái) và trong LabVIEW (Phải)

HWND VFWAPI capCreateCaptureWindow(
    LPCTSTR lpszWindowName,
    DWORD dwStyle,
    int x,
    int y,
    int nWidth,
    int nHeight,
    HWND hWnd,
    int nID
);
  
Sau khi cấu hình cho hàm, ta viết code trong block digram như sau. Chú ý là đối tượng PictureBox được lấy từ control pallet
Ngoài ra để hoàn thiện chương trình ta phải sử dụng thêm hàm SendMessage trong thư viện của User32.dll sau khi đã cấu hình cho webcam bởi hàm capCreateCaptureWindow trên đây.
Tuy nhiên một điều cần lưu ý là ứng dụng viết bởi avicap32.dll sẽ không điều chỉnh được độ phân giải bởi vì các hàm trong avicap32.dll chỉ đơn thuần hỗ trợ việc thu nhận tín hiệu
video và chụp hình….
   
Phương pháp 2: Sử dụng bộ thư viện webcam USB
Phương pháp 1 đòi hỏi người lập trình với webcam cần phải có một kiến thức nhất định về thu nhân hình ảnh, các hàm và chức năng của thư viện liên kết động, cấu trúc của hàm LabVIEW gọi các hàm từ
trong thư viện liên kết động. Thì có một phương pháp khác đơn giản hơn nhiều mà không đòi hỏi người lập trình LabVIEW một kiến thức cao về hệ điều hành hay các thư viện của Microsoft. Đó là sử dụng bộ thư viên cho các loại USB webcam do cộng động sử dụng LabVIEW xây dựng (Đây không phải là bộ toolkit của NI và được hoàn toàn miễn phí).
Trước hết, download bộ thư viện các hàm truyền nhân dành cho USB webcam ở đây
Giải nén các file vừa download và copy vào thư mục user.lib folder. Lưu ý, nếu trên máy tính cài nhiều phiên bản của LabVIEW thì bạn phải quyết định copy thư viện trên tương ứng với thư viện người dùng trên chính phiên bản đó. Như vậy thì trên function pallet của LabVIEW phiên bản đó mới hiện ra các hàm hỗ trợ webcam USB này. Ví dụ như ở dưới đây:
Khi đó, việc tiến hành viết một ứng dụng để thu nhận hình ảnh, tín hiệu video từ webcam được tiến hành một cách đơn giản như sau:
Đầu tiên, phải thiết lập các thông số ban đầu cho webcam (Webca, Initialize VI). Các thông số này bao gồm: Webcam số mấy trong số các webcam kết nối vào máy tính, chiều cao và độ rộng của hình ảnh. Sau đó tiến hành chụp hình từ webcam (Webcam Grab), chuyển tín hiệu chụp được thành hình ảnh (Webcam Picture VI). Đưa hình ảnh thu được lên
giao diện (Webcam flat to picture VI). Cuối cùng là đóng kết nối với webcam đó lại (Webcam Close VI).
Phương pháp 3: Sử dụng sự trợ giúp của NI Vision assistant.
Còn có thêm một phương pháp đơn giản hơn nữa đó là sử dụng NI Vision Assistant (Và vì sử dụng nó quá đơn giản trong các nhiệm vụ truyền nhận hình ảnh, video nên bạn phải trả
tiền_còn không thì phải xài bản Evaluation, mà với phiên bản Evaluation thì không thể sử dụng tính năng buid ứng dụng thành code LabVIEW hay C).
NI Vision assistant là một gói phần mềm riêng biệt với LabVIEW có thể dùng để xây dựng nên các ứng dụng liên quan đến thu nhận và truyền dữ liệu hình ảnh, video từ các thiết bị ngoại vi. Với phiên bản từ 2009, NI Vision assistant có thể làm việc với các loại camera của nhiều hãng sản xuất, các loại webcam USB, smart camera của NI…Một ưu điểm rất
mạnh của NI vision assistant là mặc dù nó có thể hoạt động độc lập với LabVIEW song nó cũng có thể xuất các ứng dụng của nó ra các LabVIEW VI. Các VI này hoàn toàn có thể
được sử dụng như các VI bình thường trong bất kì chương trình LabVIEW nào. Ngoài ra, nó còn có thể xuất các ứng dụng của nó ra các hàm trong C hay LabWindow.
Đây là một gói phần mềm yêu cầu license riêng nên người dùng phải trả tiền (Hoặc tìm cách crack). Cách sử dụng thật hết sức đơn giản.
Trước hết khởi động NI Vision Assitant từ Start/Program hoặc có thể khởi động từ chính LabVIEW. Nếu bạn có một thiết bị thu nhận hình ảnh (camera hay webcam) và bạn muốn
truyền nhận hình ảnh trực tiếp từ thiết bị đó thì nhớ chọn chế độ hoạt động acquire Image.
Sau khi khởi động xong, màn hình giao diện sẽ có dạng như dưới đây.
 
Tiếp theo là phần cấu hình và thiết lập cho camera của bạn. Tuỳ thuộc vào loại thiết bị camera kết nối vào máy tính của mình, bạn có thể lựa chọn tương ứng với các chế độ thiết lập ban đầu của NI Smart
Cameras, digital and analog frame grabbers, DCAM-compliant IEEE 1394 cameras, Gigabit Ethernet (GigE) Vision cameras hoặc một thiết bị USB webcam nào đó. ở đây, tôi sử dụng loại webcam ZS0211 của nhà sản xuất Vimocro nên tôi sẽ lựa chọn cấu hình Acquire Image (1394,GigE or USB).
Khi đó, tôi sẽ có thể cấu hình cho thiết bị của mình với các thông số như sau.
Target: Sử dụng camera trên chính máy của mình hay máy tính nào đó trong mạng máy tính. Tuy nhiên đối với thiết bị USB webcam thì không hỗ trợ chức năng truyền nhận tín hiệu hình ảnh từ một webcam gắn trên máy tính khác trong mạng.
Devices: Lựa chọn một camera trong số các camera kết nối với thiết bị.
Video Mode: Lựa chọn chế độ hoạt động của camera. Đối với các loại camera thông minh, hiện đại khác thì có nhiều chế độ hoạt động, nhưng đối với webcam mà tôi đang sử
dụng thì các lựa chọn trong Video mode chỉ đơn thuần là kích cỡ, tiêu chuẩn khung hình ảnh mà sẽ hiện thỉ (ví dụ: 640×480 RGB24 15.00fps là sự lựa chọn của tôi cho ví dụ này).
Tiếp theo là thực hiện các quá trình thu nhận tín hiệu theo các chức năng có sẵn trên giao diện chương trình:
Acquire Single Image – Chỉ truyền nhận và hiển thị một khung hình ảnh đơn lẻ.
Acquire Continuous Images –  Cho phép truyền nhận hình ảnh một cách liên tục (Video)
Sequence Acquisition – Thu nhận hình ảnh một cách tuần tự. Bạn có thể thiết lập số lượng khung hình mà chương trình sẽ truyền nhận, thời điểm bắt đầu và kết thúc của việc
truyền nhận tín hiệu.
Một số hình ảnh thu được từ webcam bằng các phương pháp đề cập ở trên
 Phương pháp 1 (Sử dụng 2 webcam)

Camera LabVIEW

Phương pháp 2

Camera LabVIEW

Phương pháp 3

Camera LabVIEW, Vision acquisition

…..(Còn nữa)