Что нового

Слежение в квартире с помощью Webcamers

Arei

Скриптер
Сообщения
938
Репутация
115
Здравствуйте, заинтересовался вопросом, как реализовать слежение в квартире, т.е если есть движение, то реагировать, но как это грамотно реализовать не знаю.
Заранее спасибо.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Можно скачать готовую программу, WebcamXP
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Нет нужно реализовать тут, т.к мне потом работать надо с результатом.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Arei
Можно по пробовать PixelGetColor или PixelChecksum, но как мне известно могут быть перепады тонов(яркость освещения).
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
В том и проблема, что срабатывают ложные оповещения.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Это круто, но нужно не только лицо, а если кто зашёл в комнату, т.е любое изменение.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Arei
На экране компа есть окно с видеокартинкой от вебкамеры?
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Хотел бы работать просто с файлами,что-бы не отвлекать людей на окно программы.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Arei
Если пишет в файл avi, скорее всего, возможно.
Если доберусь в ближайшее время до компа с вебкамерой, проверю один алгоритм...
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
НАшёл алгоритм для мониторинга, попробую разобраться и если получится то выложу.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Arei

Использован измененный алгоритм анализа изображения от Yashied
Способ не без недостатков.
Webcam.au3 взята по указанной в скрипте ссылке (они разные вроде бывают)
Пишет в консоль "0", если нет движения, и рандомное число - если картинка меняется. Уровень чувствительности можно настраивать.
Проверил только 1 раз - дали ненадолго ноут с вебкамерой (ОС - XP), так что могут быть ошибки.
Код:
#include <APIConstants.au3>
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <GUIConstants.au3>
#include <Webcam.au3> ; http://www.autoitscript.com/forum/topic/68866-webcam-udf/page__hl__Webcam%20%20UDf

$gui = GUICreate('Webcam Test', 640, 480)
HotKeySet('{Esc}', 'quit')

_WebcamInit()
_Webcam($gui, 640, 480, 0, 0)
GUISetState(@SW_HIDE)


Global $razn = 6 ; уровень детекта
Global $C = 100 ; коэфф маштабирования

$checksum = _Matrix()
$i = 0
While 1
	;Sleep(400)
	$Ma = _Matrix()

	For $i = 0 To UBound($Ma) - 1
		If $checksum[$i] <> $Ma[$i] Then $i += $i
	Next
	If $i > $razn Then
		$checksum = $Ma
		$i = 0
		ConsoleWrite(Random(1, 10) & @CRLF) ; какие-то цифры, если есть движение перед камерой
	Else
		ConsoleWrite('0' & @CRLF) ; 0, если движения нет
	EndIf
WEnd

Func _Matrix()

	_WebcamSnapShot(@ScriptDir & '\snapshot.bmp')
	
	_GDIPlus_Startup()

	$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\snapshot.bmp')

	If $hImage = 0x00000000 Then Exit 2

	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)

	$W = _GDIPlus_ImageGetWidth($hImage)
	$H = _GDIPlus_ImageGetHeight($hImage)

	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()
	
	Dim $Matrix[Round($H / $C)][Round($W / $C)]
	Dim $HLS[3]

	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()

	$hSrcDC = _WinAPI_CreateCompatibleDC(0)
	$hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap)
	$hDstDC = _WinAPI_CreateCompatibleDC(0)
	$hDib = _WinAPI_CreateDIB(1, 1)
	$hDstSv = _WinAPI_SelectObject($hDstDC, $hDib)
	_WinAPI_SetStretchBltMode($hDstDC, $HALFTONE)

	For $y = 0 To $H / $C - 1
		For $x = 0 To $W / $C - 1
			_WinAPI_StretchBlt($hDstDC, 0, 0, 1, 1, $hSrcDC, $x * $C, $y * $C, $C, $C, $SRCCOPY)
			$RGB = _WinAPI_GetPixel($hDstDC, 0, 0)
			_WinAPI_ColorRGBToHLS($RGB, $HLS[0], $HLS[1], $HLS[2])
			$Matrix[$y][$x] = $HLS[1]
		Next
	Next
	_WinAPI_SelectObject($hSrcDC, $hSrcSv)
	_WinAPI_DeleteObject($hBitmap)
	_WinAPI_DeleteDC($hSrcDC)
	_WinAPI_SelectObject($hDstDC, $hDstSv)
	_WinAPI_DeleteObject($hDib)
	_WinAPI_DeleteDC($hDstDC)
	;_ArrayDisplay($Matrix, 'Luminance')
	$Min = 240
	$Max = 0

	For $y = 0 To $H / $C - 1
		For $x = 0 To $W / $C - 1
			If $Min > $Matrix[$y][$x] Then $Min = $Matrix[$y][$x]
			If $Max < $Matrix[$y][$x] Then $Max = $Matrix[$y][$x]
		Next
	Next

	$Q = Round(($Min + $Max) / 2)
	$ggg = 0
	Dim $fff[$W / $C - 1]

	For $y = 0 To $H / $C - 1
		For $x = 0 To $W / $C - 1
			;$Matrix[$y][$x] = $Matrix[$y][$x]
			$ggg += Number($Matrix[$y][$x] < $Q)
		Next
		$fff[$y] = $ggg
		$ggg = 0
	Next
	Return $fff
EndFunc   ;==>_Matrix

Func quit()
	Exit
EndFunc   ;==>quit
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Кто-нибудь проверил? Работает?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
WSWR
работает. правда, долго не тестил, но пока ошибок не было ;)
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
У меня windows 7 и эта UDF не работает и не могу проверить к сожалению.


Добавлено:
Сообщение автоматически объединено:

Может кто подскажет почему?
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
странно, а можете свою библиотеку скинуть.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Там в библиотеке вызов какой-то dll, и сохранение картинки в файл.
Скорее всего возможно вообще без файлов обойтись.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
У кого работает тот скрипт и стоит Windows 7 X64 скиньте библиотеку Webcam.au3.
Заранее спасибо.


Добавлено:
Сообщение автоматически объединено:

перефразию немного, скрипт работает на Windows 7 X64 , один раз, но при повторном запуске выскакивает окно для подтверждения Webcamer/ и потом программа выключается. Небыло ли похожего у вас коллеги?
 
Верх