These classes inherit from vpDetectorBase class, a generic class dedicated to detection. For each detected bar code, it allows to retrieve some characteristics such as the bar code message if it exists, and in the image the polygon that contains the bar code, the bounding box or the center of gravity of the bar code.

In the next sections you will find examples that show how to detect codes in a single image and or in images acquired from a camera connected to your computer.

Note that all the material (source code and image) described in this tutorial is part of ViSP source code and could be downloaded using the following command:

Bar code detection (single image)

The following example also available in tutorial-barcode-detector.cpp allows to detect either a QR code or Data Matrix on a single image. The user can select with –code-type option which code to detect.

First we have to include the header of the two classes that allow to detect either the QR code or the Data Matrix code.

#include <visp3/detection/vpDetectorDataMatrixCode.h>

#include <visp3/detection/vpDetectorQRCode.h>

Then in the main() function before going further we need to check if at least one of the third party (zbar or dmtx libraries) were used to build ViSP. We also check if ViSP is able to display images using either X11, or the Graphical Device Interface (GDI) under Windows, or OpenCV.

Bar code detection (live camera)

This other example also available in tutorial-barcode-detector-live.cpp shows how to couple the bar code detector to an image grabber in order to detect bar codes on each new image acquired by a camera connected to your computer.

with option –code-type you select if you want to detect a QR code (use –code-type 0) or a Data Matrix (use –code-type 1).

if more than one camera is connected to you computer, with option –device you can select which camera to use. The first camera that is found has number 0.

To detect QR codes on images acquired by a second camera connected to your computer use:

$ ./tutorial-barcode-detector-live --code-type 0 --device 1

The source code of this example is very similar to the previous one except that here we use camera framegrabber devices (see Tutorial: Image frame grabbing). Two different grabber may be used:

If ViSP was build with Video For Linux (V4L2) support available for example on Fedora or Ubuntu distribution, VISP_HAVE_V4L2 macro is defined. In that case, images coming from an USB camera are acquired using vpV4l2Grabber class.

If ViSP wasn't build with V4L2 support, but with OpenCV we use cv::VideoCapture class to grab the images. Notice that when images are acquired with OpenCV there is an additional conversion from cv::Mat to vpImage.

Next tutorial

Now you can follow Tutorial: Pose estimation from points that explains how to compute a 3D pose from points. This tutorial could be useful if you want to compute the pose of a QR code from it’s 4 corner coordinates in the image that could be retrieved using getPolygon(), it’s 3D size and camera parameters.