0 / 0 / 0
Регистрация: 17.04.2015
Сообщений: 1
1

Простой программный датчик движения для ВЕБ-камеры

30.05.2016, 21:21. Показов 2095. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Для организации псевдо-наблюдения за дачей, порылся в инете и нашел кусочки кода для веб-камеры. Как обычно нужное удалил, ненужное добавил. Прикрутил на всякий случай псевдо-датчик движения. В итоге датчик худо-бедно работает. Друзья, если у кого-то есть мысли как сделать нормальный датчик, подскажИте. Прошу также высказывать замечания.

Создайте проект и сохраните его. В папке с проектом создайте папку "\Screen" и "\SnapShot".
Разместите на форме элементы и запустите проект.
Кнопка "Начать запись" - запись отдельных кадров в папку "\Screen".
Кнопка "Сделать снимок" - одиночный снимок в папку "\SnapShot"
Кнопка "Детектор движения" - подключить датчик движения
List1 - выбор размера картинки

На форме Form1: Timer1, Timer2, Timer3, Timer4, Picture1 (0), Command1, Command2, Command3, List1, Label1, Check1, Check2
Свойства Check1.Style = 1, Check2.Style = 1

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
Option Explicit
'
Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type
'
Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type
'
Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type
'
'Размер картинки (потока)
Private Type picSIZE
    Width As Long
    Height As Long
End Type
'
Dim Bt As BITMAPINFO
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
'
Private Const WM_USER = 1024
Private Const WM_CAP_DLG_VIDEOFORMAT As Long = WM_USER + 41
'
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal lpszWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal nID As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'
Private mCapHwnd As Long
'
Private Const CONNECT As Long = 1034
Private Const DISCONNECT As Long = 1035
Private Const GET_FRAME As Long = 1084
Private Const COPY As Long = 1054
'
''''''''''''''''''
Private Const WM_CAP_START = WM_USER
Private Const WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44
Private Const WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45
Private Const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10
''''''''''''''''''''''''''''''''''''
'
Dim FileParam As String
'
Dim tempFilename As String
Dim pZ() As picSIZE
Dim mZ As picSIZE   'Текущие размеры картинки
Dim xZ As picSIZE   '
'
Dim levelSENS As Long   'Уровень срабатывания датчика движения
'
 
Private Sub Check1_Click()
    If Check1.Value = 1 Then
        Timer2.Enabled = True
        Check1.Caption = "Stop REC"
    Else
        Check1.Caption = "Start REC"
        Timer2.Enabled = False
    End If
End Sub
 
Private Sub Check2_Click()
    Check2.Tag = 0
    If Check2.Value = 1 Then
        Timer3.Enabled = True
    Else
        Timer3.Enabled = False
    End If
End Sub
 
Private Sub Form_Load()
Dim i As Integer, j As Integer, chm As Integer, ff As Integer
    '
    Timer1.Enabled = True
    Timer1.Interval = 50
    Timer2.Enabled = False
    Timer2.Interval = 1000
    Timer3.Enabled = False
    Timer3.Interval = 250
    Timer4.Enabled = False
    Timer4.Interval = 100
    '
    Form1.ScaleMode = 3
    Form1.Width = 9900
    Form1.Height = 9500
    '
    Picture1(0).ScaleMode = 3
    Picture1(0).Left = 8
    Picture1(0).Top = 8
    Picture1(0).Width = 640
    Picture1(0).Height = 480
    Picture1(0).AutoRedraw = True
    Picture1(0).AutoSize = True
    '
    Command1.Left = 96
    Command1.Top = 528
    Command1.Width = 97
    Command1.Height = 33
    Command1.Caption = "Сделать снимок"
    '
    Command2.Left = 16
    Command2.Top = 528
    Command2.Width = 73
    Command2.Height = 33
    Command2.Caption = "Пуск"
    '
    Command3.Left = 16
    Command3.Top = 568
    Command3.Width = 73
    Command3.Height = 33
    Command3.Caption = "Close"
    '
    Command4.Left = 96
    Command4.Top = 528
    Command4.Width = 97
    Command4.Height = 33
    Command4.Caption = "Сделать снимок"
    '
    List1.Left = 200
    List1.Top = 528
    List1.Width = 65
    List1.Height = 69
    '
    Label1.Left = 600
    Label1.Top = 544
    Label1.Width = 31
    Label1.Height = 30
    Label1.Alignment = 2
    Label1.Appearance = 0
    Label1.Caption = ""
    '
    ReDim pZ(5)
    '
    pZ(0).Width = 640
    pZ(0).Height = 480
    '
    pZ(1).Width = 352
    pZ(1).Height = 288
    '
    pZ(2).Width = 320
    pZ(2).Height = 240
    '
    pZ(3).Width = 176
    pZ(3).Height = 144
    '
    pZ(4).Width = 160
    pZ(4).Height = 120
    '
    'Прочитаем текущие размеры из файла
    FileParam = App.Path & "\param.txt"
    ff = FreeFile()
    Open FileParam For Random As ff Len = 256
        Get #ff, 1, xZ
        'Put #ff, 1, firstRec
    Close ff
    '
    'Есть такой формат картинки?
    For i = 0 To 4
        If xZ.Width = pZ(i).Width And xZ.Height = pZ(i).Height Then
            mZ = pZ(i)  'Нашли размер
            GoTo mk
        End If
    Next i
    mZ = pZ(0)  'Если такого размера нет, то установим 640*480
mk:
    '
    For j = 0 To UBound(pZ) - 1
        List1.AddItem pZ(j).Width & " * " & pZ(j).Height
    Next j
    '
    List1.ListIndex = i     'Индекс i такой размер есть!
    '
    Load Picture1(1)
    '
    levelSENS = 20  'Уровень срабатывания датчика движения
    '
    Clipboard.Clear
    STARTCAM
    Command2.Enabled = False 'Запретить повторный запуск
End Sub
'
Private Sub Command1_Click()
Dim newF As String
    '
    'STOPCAM
    tempFilename = App.Path & "\Screen\img-" & Format(Now, "mmddyy-hhmmss") & ".bmp"
    'newF = "d:\img-" & Format(Now, "mmddyy-hhmmss") & ".bmp"
    SavePicture Picture1(0).Image, tempFilename
    'FileCopy tempFilename, newF
End Sub
'
Private Sub Command2_Click()
    tempFilename = ""
    STARTCAM
End Sub
'
'Задать новые размеры
'Задаваемый размер должен поддерживаться камерой
Private Sub GetSizePic(newW As Long, newH As Long)
Dim rt As Long
    '
    'Если текущий размер совпадает с новым - выход и ничего не меняем
    If mZ.Width = newW And mZ.Height = newH Then Exit Sub
    '
    mZ.Width = newW
    mZ.Height = newH
    '
    If SendMessage(mCapHwnd, WM_CAP_DRIVER_CONNECT, 0, 0) <> 0 Then
        rt = SendMessage(mCapHwnd, WM_CAP_GET_VIDEOFORMAT, Len(Bt), Bt)
        Bt.bmiHeader.biWidth = mZ.Width
        Bt.bmiHeader.biHeight = mZ.Height
        'Bt.bmiHeader.biSize = Len(Bt.bmiHeader)
        'Bt.bmiHeader.biPlanes = 1
        'Bt.bmiHeader.biBitCount = 24
        rt = SendMessage(mCapHwnd, WM_CAP_SET_VIDEOFORMAT, Len(Bt), Bt)
    End If
    'Picture1(0).Refresh
 
    mCapHwnd = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, mZ.Width, mZ.Height, Me.hwnd, 0)
    DoEvents
    SendMessage mCapHwnd, CONNECT, 0, 0
    Call newSIZE(mZ)
End Sub
'
Private Sub Command4_Click()
 Dim temp As Long
 'If startcap = True Then
  temp = SendMessage(mCapHwnd, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&)
'End If
End Sub
'
Private Sub List1_Click()
Dim i As Integer
Dim val As Integer
    '
    val = Check2.Value
    Check2.Value = 0
    i = List1.ListIndex
    Call GetSizePic(pZ(i).Width, pZ(i).Height)
    Sleep 2000
    If val = 1 Then Check2.Value = 1
    
End Sub
'
Private Sub Timer1_Timer()
    On Error Resume Next
    '
    SendMessage mCapHwnd, GET_FRAME, 0, 0
    SendMessage mCapHwnd, COPY, 0, 0
    Picture1(0).Picture = Clipboard.GetData
    Clipboard.Clear
    '
End Sub
'
Sub STOPCAM()
    DoEvents: SendMessage mCapHwnd, DISCONNECT, 0, 0
    Timer1.Enabled = False
End Sub
'
Sub STARTCAM()
Dim rt As Long
    '
    mCapHwnd = capCreateCaptureWindow("WebcamCapture", 0, 0, 0, mZ.Width, mZ.Height, Me.hwnd, 0)
    DoEvents
    rt = SendMessage(mCapHwnd, CONNECT, 0, 0)
    '
    If rt = 0 Then  'Возможно попали в режим выбора камеры
        'Выбрали камеру и запускаем снова
        rt = SendMessage(mCapHwnd, CONNECT, 0, 0)
    End If
    'Опять проверим
    If rt = 0 Then
        'Выходим
        Unload Me
    Else
        'Запустим таймер для показа картинок
        Timer1.Enabled = True
    End If
End Sub
'
Private Sub Form_Unload(Cancel As Integer)
  Screen.MousePointer = vbDefault
  STOPCAM
End Sub
'
Private Sub Command3_Click()
  Unload Me
End Sub
'
Private Function newSIZE(bZ As picSIZE) As Integer
Dim ff As Integer
    '
    FileParam = App.Path & "\param.txt"
    ff = FreeFile()
    Open FileParam For Random As ff Len = 256
        'Get #ff, 1, xZ
        Put #ff, 1, bZ
    Close ff
End Function
'
Private Sub Timer2_Timer()
Static sT As Integer
    '
    If sT = 100 Then
        Form1.Caption = "Остановите программу и очистите папку SnapShot"
    Else
        tempFilename = App.Path & "\SnapShot\img-" & Format(Now, "mmddyy-hhmmss") & ".bmp"
        SavePicture Picture1(0).Image, tempFilename
        sT = sT + 1
    End If
End Sub
'
'Фото для датчика движения
Private Function Detect() As Long
Dim rt As Double, i As Integer, j As Integer
Dim X As Long, xy As Long, p1 As Long, p2 As Long, dp As Long
Dim dt As Double, sDESTR As Double
    '
    xy = Picture1(0).ScaleWidth * Picture1(0).ScaleHeight
    For i = 1 To Picture1(0).ScaleWidth
        For j = 1 To Picture1(0).ScaleHeight
            p1 = GetPixel(Picture1(0).hdc, i, j)
            p2 = GetPixel(Picture1(1).hdc, i, j)
            dp = Abs(p1 - p2)
            dt = dt + dp
            sDESTR = dt
            sDESTR = sDESTR / Picture1(0).ScaleHeight
            sDESTR = sDESTR / Picture1(0).ScaleWidth
            sDESTR = sDESTR / 16777215
            sDESTR = sDESTR * 1000
            If sDESTR > levelSENS Then
                dt = sDESTR + 1
                GoTo ext
            End If
        Next j
    Next i
    dt = dt / Picture1(0).ScaleHeight
    dt = dt / Picture1(0).ScaleWidth
    dt = dt / 16777215
    dt = dt * 1000
ext:
    Detect = CLng(dt)
End Function
'
Private Sub Timer3_Timer()
Dim dt As Long
    '
    'Включен детектор движения?     Сравним картинки.
    If Check2.Value = 1 Then        'Включен
        If Check2.Tag = 0 Then  '1-й проход
            Set Picture1(1).Picture = Picture1(0).Picture
            Check2.Tag = 1
        Else
            dt = Detect     'Сравнение
            Label1.Caption = dt
            'Срабатывание будет при 20
            If dt > 20 Then
                Timer4.Enabled = True
            End If
            Set Picture1(1).Picture = Picture1(0).Picture
        End If
    End If
End Sub
'
Private Sub Timer4_Timer()
Static sT As Integer
    '
    If sT = 0 Then
        Beep
        Label1.BackColor = &HC0&
        sT = sT + 1
    Else
        Timer4.Enabled = False
        Label1.BackColor = &H80000005
        sT = 0
    End If
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2016, 21:21
Ответы с готовыми решениями:

Нужен софт для использования веб камеры в качестве камеры наблюдения
Здрасте, у меня следующий вопрос: имеется старая веб камера, хочу ее аккуратно прилепить над...

Ультразвуковой датчик для измерения скорости движения
Добрый день. Нужен датчик скорости. Пришла в голову такая идея: взять два УЗ сенсора, один...

Простой датчик перехода через 0 для AVR (с опторазвязкой)
Всем привет ! Заморачиваюсь потихоньку с AVRками, 1-Wire и прочим, автоматизирую домашние мелочи...

Создайте программный код для движения геометрического объекта по заданной траектории
Создайте программный код для движения геометрического объекта по заданной траектории.Для рисования...

1
Модератор
9722 / 3683 / 871
Регистрация: 22.02.2013
Сообщений: 5,529
Записей в блоге: 78
30.05.2016, 21:41 2
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Вместо GetPixel юзай GetDiBits раз в 100 поднимешь скорость (зависит от размеров картинки).
0
30.05.2016, 21:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2016, 21:41
Помогаю со студенческими работами здесь

Драйвер для веб-камеры
1. Я имею Веб-камеру для PC : Defender Web Focus (со встроенным микрофоном). 2. Веб-камера...

COM Object для веб-камеры
Как написать Com-object для веб камеры?

Драйвер для веб-камеры
что делать нет драйверов на вебку для симерки.

Драйвер для веб-камеры Ubuntu 13.10
Здравствуйте, подскажите пожалуйста новичку как установить драйвер на веб камеру canyon cnp-wcam313g


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru