Tạo thư viện lấy hình ảnh video từ camera

Một phần của tài liệu Thực tại ảo cho điều khiển từ xa (Trang 45)

Để giao tiếp với camera, phải sử dụng các hàm giao diện lập trình ứng

dụng, tức là các hàm Win32 API (Application Programming Interface) mức

thấp. API đơn giản chỉ là giao diện lập trình của hệ điều hành Windows. Các

ứng dụng được viết cho Windows gọi các hàm API để thực hiện các tác vụ từ

mức chung chung như tạo và huỷ các cửa sổ (window), các nút điều khiển

(controls), các thực đơn (menu) ; truy xuất các dịch vụ hệ thống cho màn hình, bàn phím, chuột ; truy xuất được các thiết bị ngoại vi còn có máy in, camera

(như trong luận văn này) ; ngoài ra còn nhiều chức năng khác. Các hàm trong

API được cung cấp trong một số tập tin thư viện liên kết động (tiếng Anh : Bắt đầu

Tạo socketConnect

Yêu cầu kết nối với port

Server chấp nhận

Nối với socketAccept của server

Trích xuất data từ network data stream

Thể hiện data thành hìnhảnh trên màn hình

Kết thúc Đúng

Đúng

Sai

Sai

Dynamic Link Library, viết tắt : DLL). Các DLL này chứa các hàm public để có

thể gọi từ các ứng dụng Windows khác (đó là ứng dụng của ta).

Cơ chế làm việc của hệ điều hành Windows với các ứng dụng đều thông qua các thông điệp… Để gửi một thông điệp, Windows cung cấp cho ta hàm

SendMessage trong thư viện liên kết động user32.dll. Đặc tả hàm này (qua ngôn ngữ Visual Basic .NET) như sau :

Private Declare Auto Function SendMessage Lib

"user32.dll" (ByVal hWnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Từ đây, ta có thể giao tiếp với camera trong hệ thống. Sau đây là một hàm

để khởi tạo camera :

Public Function Start(ByVal CamIndexNumber As Integer, ByVal PreviewHandleControl As Int32) As Boolean

'// PreviewHandleControl: The handle to to the control to set the image on

If _isRunning = True Then

MessageBox.Show("Camera is already running", "LocalCamera::Start()", MessageBoxButtons.OK,

MessageBoxIcon.Exclamation) (adsbygoogle = window.adsbygoogle || []).push({});

Return False 'Exit Function Else _iCamIndexNumber = CamIndexNumber HandleControl = PreviewHandleControl Handle = capCreateCaptureWindowA(_iCamIndexNumber.ToString, WS_VISIBLE Or WS_CHILD, 0, 0, 0, 0, PreviewHandleControl, 0)

If SetupCamera() = False Then

MessageBox.Show("Error setting up camera", "LocalCamera::Start()", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Return False Else Return True End If End If End Function

Handle chính là thẻ quản để quản lý camera trong hệ thống. Mỗi một đối tượng sẽ có một con số riêng biệt để cho Window nhận biết và quản lý. Và hàm SendMessage chỉ làm việc với thẻ quản :

Private Function SetupCamera() As Boolean 'Private Function SetCamera() As Boolean

If SendMessage(Handle, WM_CAP_DRIVER_CONNECT, _iCamIndexNumber, 0) = 1 Then

SendMessage(Handle, WM_CAP_SET_SCALE, 1, 0) SendMessage(Handle, WM_CAP_SET_PREVIEWRATE, _iCamFrameRate, 0)

SetWindowPos(Handle, HWND_BOTTOM, 0, 0, _iCamFrameWidth, _iCamFrameHeight, SWP_NOMOVE Or SWP_NOZORDER)

_isRunning = True Return True Else _isRunning = False Return False End If End Function

Cứ như thế, phần lớn chỉ việc dùng hàm SendMessage tác dụng lên thẻ

quản Handle với các đối số để tạo nên thư viện quản lý camera của ta. Ví dụ :

Public Sub ShowVideoSourceSettings()

SendMessage(Handle, WM_CAP_DRIVER_CONNECT, 0, 0) SendMessage(Handle, WM_CAP_DLG_VIDEOSOURCE, 0, 0) End Sub

'//==================================================// Public Sub ShowVideoFormatSettings()

SendMessage(Handle, WM_CAP_DRIVER_CONNECT, 0, 0) SendMessage(Handle, WM_CAP_DLG_VIDEOFORMAT, 0, 0) End Sub

Một phần của tài liệu Thực tại ảo cho điều khiển từ xa (Trang 45)