# SoftBank Robotics documentation What's new in NAOqi 2.8?

# Getting an image

<< return to C++ examples

The aim of this example is to show how to retrieve images from NAO’s cameras. The images will be displayed in a window, using OpenCV library. Press ESC to exit the application.

The whole example is available here: `getimage.zip`

## Source file:

`getimages.cpp`

    /**
     *
     * This example demonstrates how to get images from the robot remotely and how
     * to display them on your screen using opencv.
     *
     * Copyright Aldebaran Robotics
     */

    // Aldebaran includes.
    #include <alproxies/alvideodeviceproxy.h>
    #include <alvision/alimage.h>
    #include <alvision/alvisiondefinitions.h>
    #include <alerror/alerror.h>

    // Opencv includes.
    #include <opencv2/core.hpp>
    #include <opencv2/highgui.hpp>

    #include <iostream>
    #include <string>

    using namespace AL;

    /**
    * \brief Shows images retrieved from the robot.
    *
    * \param robotIp the IP adress of the robot
    */
    void showImages(const std::string& robotIp)
    {
      /** Create a proxy to ALVideoDevice on the robot.*/
      ALVideoDeviceProxy camProxy(robotIp, 9559);

      /** Subscribe a client image requiring 320*240 and BGR colorspace.*/
      const std::string clientName = camProxy.subscribe("test", kQVGA, kBGRColorSpace, 30);

      /** Create an cv::Mat header to wrap into an opencv image.*/
      cv::Mat imgHeader = cv::Mat(cv::Size(320, 240), CV_8UC3);

      /** Create a OpenCV window to display the images. */
      cv::namedWindow("images");

      /** Main loop. Exit when pressing ESC.*/
      while ((char) cv::waitKey(30) != 27)
      {
        /** Retrieve an image from the camera.
        * The image is returned in the form of a container object, with the
        * following fields:
        * 0 = width
        * 1 = height
        * 2 = number of layers
        * 3 = colors space index (see alvisiondefinitions.h)
        * 4 = time stamp (seconds)
        * 5 = time stamp (micro seconds)
        * 6 = image buffer (size of width * height * number of layers)
        */
        ALValue img = camProxy.getImageRemote(clientName);

        /** Access the image buffer (6th field) and assign it to the opencv image
        * container. */
        imgHeader.data = (uchar*) img[6].GetBinary();

        /** Tells to ALVideoDevice that it can give back the image buffer to the
        * driver. Optional after a getImageRemote but MANDATORY after a getImageLocal.*/
        camProxy.releaseImage(clientName);

        /** Display the iplImage on screen.*/
        cv::imshow("images", imgHeader);
      }

      /** Cleanup.*/
      camProxy.unsubscribe(clientName);
    }

    int main(int argc, char* argv[])
    {
      if (argc < 2)
      {
        std::cerr << "Usage 'getimages robotIp'" << std::endl;
        return 1;
      }

      const std::string robotIp(argv[1]);

      try
      {
        showImages(robotIp);
      }
      catch (const AL::ALError& e)
      {
        std::cerr << "Caught exception " << e.what() << std::endl;
      }

      return 0;
    }

## CMakeLists.txt:

The corresponding CMakeLists.txt file is the following:

`CMakeLists.txt`

    ##
    # Copyright (C) 2010 Aldebaran Robotics

    cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR)
    project(getimages)
    # this lets you find the qibuild cmake frameworl
    find_package(qibuild)

    # Here, we create an executable named "getimages" from the cpp file.
    qi_create_bin(getimages getimages.cpp)

    # Here we say that our executable depends on
    # - ALCOMMON (main naoqi lib)
    # - ALPROXIES (using specialized naoqi proxies)
    # - ALVISION (for vision definitions)
    # - OPENCV (display)
    #
    # It automatically links with the corresponding libraries and make their headers
    # available.
    qi_use_lib(getimages ALCOMMON ALPROXIES ALVISION OPENCV3_CORE OPENCV3_HIGHGUI)

Warning

Please read Using OpenCV before trying to use this example on your desktop if you are using linux.

Glossary Site map Index Support Contact Legal Notices