Difference between revisions of "AxisMotionDetection"

From ZoneMinder Wiki
Jump to navigationJump to search
Line 150: Line 150:


Edited / Updated By: TheForce
Edited / Updated By: TheForce
========================================================================
I have a SBC (RasPi) with a USB webcam, 640x480, attached.  Script 1 is:
  #!/bin/bash
  mkdir /run/shm/cam2
  cd /run/shm/cam2
  mplayer −quiet tv:// -vo jpeg &> /dev/null
Script 2 is:
  #!/bin/bash
  mkdir /run/shm/cam2
  cd /run/shm/cam2
  rm *.jpg
  while [ 1 ]
  do
    f=`ls -t ????????.jpg 2> /dev/null | head -1`
    if [ $f ]
    then
      as=$(wc -c < "$f")
      if [ $as -ge 1000 ]
      then
        mv $f mcam.jpg
      fi
    fi
  done
Both scripts run in the background by root.  The first script creates seq. jpg files.  00000001.jpg, 2.jpg, 3, 4...  The second script finds a competed jpg and renames it mcam.jpg.
Also required is "ln -s /run/shm/cam2/mcam.jpg /var/www/[html]/mcam.jpg.  After that in Zoneminder  create as a new camera: Remote, http, simple, 192.168.0.ip, /mcam.jpg, 640, 480.  Run script 1 for a full minute to find out how many frames per second mplayer will produce and use that number (-1) for fps.
Created By: liderbug

Revision as of 09:59, 22 December 2015

I had this performance problem while monitoring and event recording for 8-10 IP cameras using the ZM. ZM is too good a software to abandon just for performance issues. So I decided I should pay more attention to the motion detection feature of the cameras I have and relieve the ZM server from the task of detecting motion. I've finally managed to use the on-camera motion detection feature of Axis Cams and here are my notes:

Cameras

I've set my Axis camera as follows:

Error creating thumbnail: Unable to save thumbnail to destination
Error creating thumbnail: Unable to save thumbnail to destination


The text "1|on 5|5|cause|text|showtext" means that alarm will be triggered for the monitor which has ID=1, alarm will set recording on alarm will be cleared after 5 seconds. The score of the alarm is 5 ( any score >0 is OK) "text" and "showtext" are just explanatory notes.

The ZM specs tells us that the format of the message can include a "duration" as long as the message is sent as: "1|on+5|5|cause|text|showtext" but the problem is the Axis camera cannot or will not save the "+" sign which appears in the message. A CGI parameter conversion problem I presume...


[Update] The Axis M3203 with firmware 5.40.9.2 will save the "+" sign. My guess is that the new firmware has fixed this issue. Try updating your firmware before modifying the zmtrigger.pl file.


I've taken care of this "+" problem with a small modification in zmtrigger.pl source (see below).

Next, I specified the host IP address of the zm computer and its default zmtrigger port of 6802.

Error creating thumbnail: Unable to save thumbnail to destination
Error creating thumbnail: Unable to save thumbnail to destination

The second important setup is the "motion detection" setup on the Axis. I created a window which covers the area of interest; kept the object size as small as possible, pulled the history slider all the way back to zero and left the sensitivity slide somewhere past the %50 value.

ZM settings

There is no special setting for the ZM except that I've assigned the "Nodect" function to my camera monitor.

Error creating thumbnail: Unable to save thumbnail to destination


[Update]Try updating your firmware before modifying the zmtrigger.pl file.


Finally, I modified the zmtrigger.pl file so that the first few lines of the function handleMessage looks like this:

Code:

        sub handleMessage{
       my $connection = shift;
       my $message = shift;
       #
       #  CUA  - Axis camera send the message quoted with"
       #  CUA  - Also Axis camera cannot save the plus sign which
       #  CUA  - possibly exists in the 1|on+20|score|cause|text|showtext formatted msg
       $message=~ s/^\"//g;
       $message=~ s/\"$//g;
       $message=~ s/on /on\+/;
       #  CUA - end of modifications
       my ( $id, $action, $score, $cause, $text, $showtext ) = split( /\|/, $message );


a few other modifications I made in the zmtrigger.pl file are commenting out some unused modules and pushes:

Code:

       use ZoneMinder::Trigger::Channel::Inet;
       #CUA use ZoneMinder::Trigger::Channel::Unix;
       #CUA use ZoneMinder::Trigger::Channel::Serial;
          use ZoneMinder::Trigger::Connection;
        my @connections;
        push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan1", channel=>ZoneMinder::Trigger::Channel::Inet->new( port=>6802 ), mode=>"rw" ) );
        #CUA push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan2", channel=>ZoneMinder::Trigger::Channel::Unix->new( path=>'/tmp/test.sock' ),         mode=>"rw" ) );
       #push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan3", channel=>ZoneMinder::Trigger::Channel::File->new( path=>'/tmp/zmtrigger.out' ), mode=>"w" ) );
        #CUA push( @connections, ZoneMinder::Trigger::Connection->new( name=>"Chan4", channel=>ZoneMinder::Trigger::Channel::Serial->new( path=>'/dev/ttyS0' ), mode=>"rw" ) );


my modifs are marked with "# CUA"


These three regular expressions remove the quotes sent by Axis which envelope the message string and insert a plus sign if the "on" command is followed by a space). These 3 statements convert an incoming message of the form

Code:

       "1|on 25|5|cause|text|showtext"


to

Code:

       1|on+25|5|cause|text|showtext


and of course, you shouln"t forget to restart zmtrigger.pl; or better still modify the zm startup script so that it starts zmtrigger.pl everytime zm is [re]started.

Note: If you plan to use the zmxap interface (to connect ZoneMinder to MisterHouse using xAP), your cause must be "Motion" (without quotes), and your text must be a single word (no spaces); eg: LAWN. In Misterhouse, the camera name will be the MONITOR name (eg: FRONT_DOOR), and the zone name will be the text (eg: LAWN). If you don't follow this convention then MisterHouse will not respond to the xAP event messages Intensive Driving Courses London properly.

I added the line '/usr/bin/zmtrigger.pl &" in the start section of /etc/init.d/zoneminder and also added the line "pkill zmtrigger.pl" in the stop section.

Code:

       start() {
       echo -n "Starting $prog: "
       $command start
       # CUA
       /usr/bin/zmtrigger.pl &


       RETVAL=$?
       [ $RETVAL = 0 ] && echo success
       [ $RETVAL != 0 ] && echo failure
       echo
       [ $RETVAL = 0 ] && touch /var/lock/zm
       return $RETVAL
       }
       stop() {
       echo -n $"Stopping $prog: "
       #
       # Why is this status check being done?
       # as $command stop returns 1 if zoneminder
       # is stopped, which will result in
       # this returning 1, which will stuff
       # dpkg when it tries to stop zoneminder before
       # uninstalling . . .
       #
       # CUA
       pkill zmtrigger.pl


I just hope that this helps other people trying to implement the on-camera motion detection with ZM.

Again; many thanks to those people who developed ZM at the first place and to those who helped it to become a perfect opensource project.

Original Thread


DO NOT PM THESE USERS ""just post a question in the forum'

Copied By: KingOfKYA

Created By: cayfer

Edited / Updated By: TheForce