Giter VIP home page Giter VIP logo

visioncpp's Introduction



Overview

VisionCpp is a lightweight header-only library for computer vision and image processing. The aim of the library is to provide a toolbox that enables performance portability for heterogeneous platforms using modern C++.

Written using SYCL 1.2.1 and compiled/tested with ComputeCpp to accelerate vision code using OpenCL devices.

Table of contents

You will need to install ComputeCpp in order to use VisionCpp, you can follow the ComputeCpp Getting Started guide that outlines the installation process. All you need to do is include the VisionCpp.hpp header in your project and you are good to go! ( assuming that OpenCL and ComputeCPP is installed correctly. )

#include <visioncpp.hpp> //all that is needed

There are some tutorials explaining how to perform different operations using VisionCpp. These cover basic Hello World, Anisotropic Diffusion, Bayer Filter Demosaic, Dense Depth Reconstruction with Block Matching Algorithm and Harris Corner Detection.

Below is a very simple application that will do the conversion RGB -> HSV. Full source code can be found in the examples folder. RGB is assumed to be a three-channel unsigned char storage with a reasonable channel order.

  // main, args, checks and all the boring stuff

  // ...

  // where VisionCpp will run.
  auto dev = visioncpp::make_device<visioncpp::backend::sycl,
                                    visioncpp::device::cpu>();

  // create a host container for input data
  std::shared_ptr<unsigned char> in_rgb(new unsigned char[3],
  [](unsigned char *dataMem) { delete[] dataMem;});

  in_rgb.get()[0] = atoi(argv[1]);
  in_rgb.get()[1] = atoi(argv[2]);
  in_rgb.get()[2] = atoi(argv[3]);

  // create a host container for output data
  std::shared_ptr<unsigned char> out_hsv(new unsigned char[3],
  [](unsigned char *dataMem) { delete[] dataMem;});

  // exiting this scope will sync data
  {
    // definition of the VisionCpp pipeline:

    // create terminal nodes - a leaf node ( data node ) of the expression tree.
    // terminal struct takes 4 arguments
    // 1st template parameter specifies the data U8 (unsigned char) C3 (three
    // channels)
    // 2nd number of columns in the storage
    // 3rd number of rows in the storage
    // 4th underlying storage type - currently only Buffer2D supported
    auto data =
        visioncpp::terminal<visioncpp::pixel::U8C3, 1, 1,
                            visioncpp::memory_type::Buffer2D>(in_rgb.get());
    auto data_out =
        visioncpp::terminal<visioncpp::pixel::U8C3, 1, 1,
                            visioncpp::memory_type::Buffer2D>(out_hsv.get());

    // unsigned char -> float RGB storage conversion
    auto node = visioncpp::point_operation<visioncpp::OP_U8C3ToF32C3>(data);
    // float RGB to float HSV conversion
    auto node2 = visioncpp::point_operation<visioncpp::OP_RGBToHSV>(node);
    // helper node that allows display of HSV
    // for unsigned char: V <- 255*V, S <- 255*S, H <- H/2 ( to fit in range of 0..255 )
    auto node3 = visioncpp::point_operation<visioncpp::OP_HSVToU8C3>(node2);

    // assign operation that writes output of the pipe to output terminal node
    auto pipe = visioncpp::assign(data_out, node3);
    // execute the pipeline
    // 1st template parameter defines if VisionCpp back-end fuses the expression
    // 2nd & 3rd shared memory sizes ( column, row )
    // 4th & 5th local work group size ( column , row )
    visioncpp::execute<visioncpp::policy::Fuse, 1, 1, 1, 1>(pipe, dev);
  }

  printf("RGB: %u %u %u \nHSV: %u %u %u \n", in_rgb.get()[0], in_rgb.get()[1],
         in_rgb.get()[2], out_hsv.get()[0], out_hsv.get()[1], out_hsv.get()[2]);

To successfully compile VisionCpp tests, you will need:

Assuming you are in the root of a git repo:

mkdir build
cd  build
cmake .. -DComputeCpp_DIR={PATH_TO_COMPUTECPP_ROOT} -DCMAKE_CXX_COMPILER={FAVORITE_CXX_COMPILER}
make -j8
make test

The output binaries will be catalogued in bin folder.

| - build
  | - bin
    | - example
    | - test

There is a set of example code in the /example/ folder of the repository. Most of the examples are performing image operations from the camera input.

Online documentation can be found here.

The documentation is created using Doxygen.

make doc

The documentation will be created in html folder in build directory.

| - build
  | - doc

Contributors always welcome! See CONTRIBUTING.md for details.

The list of contributors.

The Apache License, Version 2.0 License. See LICENSE for more.

  • The Tuple class works only with clang++.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.