Written using SYCL 1.2 and compiled/tested with ComputeCpp to accelerate vision code using OpenCL devices.
- Integration
- Sample Code
- Requirements
- Build
- Examples
- Documentation
- Contributing
- Resources
- License
- Known Issues
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
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:
- ComputeCpp (https://codeplay.com/products/computesuite/computecpp)
- OpenCV 3.2 (https://github.com/opencv/opencv) - used for camera access, window display and as a testing reference.
- GTest (https://github.com/google/googletest) - testing framework.
- OpenCL 1.2
Assuming you are in the root of a git repo:
mkdir build
cd build
cmake .. -DCOMPUTECPP_PACKAGE_ROOT_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
Most of the examples are using camera.
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++.