Project siker: OBS Mozgás érzékelő

Az időjárás lassan javul, olyannyira, hogy már énekesmadarak is megjelentek az udvaron. Van kint egy régi, vízzel teli edényem, amit rendszeresen ivásra és fürdésre használnak. Már régóta szerettem volna néhány minőségi videót készíteni róluk, ahogyan azt néhány évvel ezelőtt egy régi kamerás telefonnal és egy OBS-szel összekapcsolt mozgásérzékelő szoftverrel tettem. Működött, de a minőség elég gyenge volt, rengeteg CPU erőforrást használt, és nem tudtam hozzányúlni a géphez, mivel billentyűparancsokon keresztül működött.
Azóta beszereztem egy olcsó USB HDMI felvevő eszközt, amely lehetővé teszi, hogy a kameráimat az OBS-hez csatlakoztassam, ez sokkal jobb minőséget és finomabb vezérlést biztosít. A minőség annyira jó, hogy most már megéri a mozgásérzékelős részt javítani.

Hogyan működik?

OBS

Az OBS a 27-es verzió óta tartalmaz egy WebSocket-kiszolgálót. Ez lehetővé teszi a teljes távvezérlést és az előnézeti képeknek a szoftverből való lekérését, így tökéletes ehhez a projekthez.
OBS WebSocket Server Settings

Tartalmaz egy Replay Buffer funkciót is, amely lehetővé teszi a folyamatos rögzítést egy trigger elsütéséig. Ez lehetővé teszi a jelenet rögzítését, mielőtt az észlelés ténylegesen megtörténne.
OBS Replay Buffer

A felvételi rész szokásos, csak referenciaként itt vannak a beállításaim. Ez az új NVENC-vel történik egy NVidia 3060 Ti-n.
OBS Recording settings

Az én kódom

A kód a WebSocket-kiszolgálón keresztül minden imageInterval másodpercben előnézeti képeket kér. Amikor a kép megérkezik, szürkeárnyalatossá konvertáljuk, és az OpenCV-JS segítségével OpenCV Mat-ba transzformáljuk. Ez tetszőleges műveleteket tesz lehetővé a képen és annak összetevőin. Amikor a következő kép megérkezik, azt kivonjuk az előzőből, és csak a különbségek maradnak meg. A különbségértékeket összegezzük és elosztjuk a kép felbontásával, így kapunk egy normalizált, számszerűsített értéket. Ez az érték egy avgSize hosszúságú tömbbe kerül. Amikor a tömb megtelt, a kód kiszámítja az összes érték átlagtól való eltérését, és összehasonlítja az aktuális kép átlagtól való eltérésével. Ha a különbség nagyobb, mint a motionLimit, az érzékelés elindul, és a Replay Buffer saveAfter másodperc után elmentésre kerül.

Ezek mind változtatható paraméterek a kód elején.

1
2
3
4
5
6
7
8
9
10
11
const wsAddress = '127.0.0.1:4455'; // OBS Websocket address
const wsPassword = '123456'; // OBS Websocket password
const obsSource = 'CameraPic'; // OBS Source name
const obsImageWidth = 108; // Checked image resolution width (keep this around 1/10 of the source resolution)
const obsImageHeight = 192; // Checked image resolution width (keep this around 1/10 of the source resolution)
const saveAfter = 120; // Seconds after replay buffer is saved. Reccommended: OBS Replay Buffer length + 5s.
const motionLimit = 20; // How big of a change is needed to trigger motion detection. Higher is less sensitive
const imageInterval = .5; // How often to check for differences in the source image
const avgSize = 10; // Averaging depth

const debug = true; // Displays standard deviance, current deviance and difference in console if set to true.

How to try?

Mindenekelőtt telepíteni kell a NodeJS-t és az NPM-et. Menj át a weboldalukra, a telepítéshez csak néhány kattintásra van szükség. Kivéve, ha Linuxon vagy, de akkor tudod, mit kell tenned.
Akkor az én kódomra van szükséged, ami itt a GitHubon elérhető.

Mellékeltem pár példát (19-et igazából), amit ezzel a kóddal rögzítettem. A videók egy Nikon D3300/Sony A5000 géppel készültek egy ilyen olcsó HDMI rögzítőkártyán keresztül, egy Helios 81N (első néhány) és egy Samyang 16mm f/2 (új objektív, erről majd később írok).

<
>