Để 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)
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