This module finds objects by matching keypoint descriptors between the current image and a set of training images. Here we use SURF keypoints and descriptors as provided by OpenCV.
The algorithm consists of 4 phases:
The algorithm comes by default with one training image, for the Priority Mail logo of the U.S. Postal Service. Search for "USPS priority mail" on the web and point JeVois to a picture of the logo on your screen to recognize it. See the screenshot of this module for an example of how it looks.
Simply add images of the objects you want to detect in JEVOIS:/modules/JeVois/ObjectDetect/images/ on your JeVois microSD card. Those will be processed when the module starts. The names of recognized objects returned by this module are simply the file names of the pictures you have added in that directory. No additional training procedure is needed. Beware that the more images you add, the slower the algorithm will run, and the higher your chances of confusions among several of your objects.
With JeVois v1.1 or later, you do not need to eject the microSD from JeVois, and you can instead add images live by exporting the microSD inside JeVois using the
With JeVois v1.2 and later you can train this algorithm live.
First, enable display of a training window using:
setpar showwin true
You should now see a grey rectangle. You can adjust the window size and aspect ratio using the
Point your JeVois camera to a clean view of an object you want to learn (if possible, with a blank, featureless background, as this algorithm does not attempt to segment objects and would otherwise also learn features of the backgrouns as part of the object). Make sure the objects fits inside the grey rectangle and fills as much of it as possible. You should adjust the distance between th eobject and the camera, and the grey rectangle, to roughly match the distance at which you want to detect that object in the future. Then issue the command:
over a serial connection to JeVois, where somename is the name you want to give to this object. This will grab the current camera image, crop it using the grey rectangle, and save the crop as a new training image somename.png for immediate use. The algorithm will immediately re-train on all objects, including the new one. You should see the object being detected shortly after you send your save command. Note that we save the image as grayscale since this algorithm does not use color anyway.
You can see the list of current images by using command:
Finally, you can delete an image using command:
where somename is the object name without extension, and a .png extension will be added. The image will immediately be deleted and that object will not be recognized anymore.
This module can send standardized serial messages as described in Standardized serial messages formatting. One message is issued on every video frame for the best detected object (highest score).
This algorithm is quite slow. So, here, we alternate between computing keypoints and descriptors on one frame (or more, depending on how slow that gets), and doing the matching on the next frame. This module also provides an example of letting some computation happen even after we exit the process() function. Here, we keep detecting keypoints and computing descriptors even outside process(). The itsKPfut future is our handle to that thread, and we also use it to alternate between detection and matching on alternating frames.