| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
This page is to give a brief introduction of a Hello World for VisionCpp.
VisionCpp is a high-level computer vision framework that supports the development
of performance portable computer vision applications running on
OpenCL-accelerated platforms. Taking advantage of SYCL's "single-source
programming style", VisionCpp allows programmers to easily develop custom vision
operations in C++ and maintain type safety across host CPU and accelerator.
The generated application will then be portable to different platforms with no
modification to the source code and with good performance.
##Hello World Example To see the whole code of this example: link
This "Hello World" creates a simple example converting RGB pixels to a greyscale pixel which is a normalised float value pixel. As input we receive a 3-channel RGB pixel. We normalise it to a 3-channel float value where each element is between 0 and 1. At the end we apply a greyscale formula to convert the pixel to grey.
This example covers some basic concepts of VisionCpp which is important in the development of more high-level applications.
// where VisionCpp will run.
auto dev = visioncpp::make_device<visioncpp::backend::sycl, visioncpp::device::cpu>();// create a host container with our input RGB data
std::shared_ptr<unsigned char> in_rgb(new unsigned char[3], [](unsigned char* dataMem) { delete[] dataMem; });
// create a host container for GREY output data
std::shared_ptr<float> out_grey(new float[1], [](float* dataMem) { delete[] dataMem; });// create terminal nodes - the leaf nodes in 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::F32C1, 1, 1, visioncpp::memory_type::Buffer2D>(out_grey.get());/// \brief This functor performs conversion from [0, 255] to [0.0f, 1.0f]
struct MyNormaliseFunctor {
/// \param in - three channel unsigned char
/// \return F32C3 - three channel float
visioncpp::pixel::F32C3 operator()(visioncpp::pixel::U8C3 in) {
const float FLOAT_TO_BYTE = 255.0f;
const float BYTE_TO_FLOAT = 1.0f / FLOAT_TO_BYTE;
return visioncpp::pixel::F32C3(static_cast<float>(in[0] * BYTE_TO_FLOAT),
static_cast<float>(in[1] * BYTE_TO_FLOAT),
static_cast<float>(in[2] * BYTE_TO_FLOAT));
}
};/// \brief This functor performs RGB to grey convertion following rule:
/// GREY <- 0.299f * R + 0,587f * G + 0.114 * B
struct MyGreyFunctor {
/// \param in - RGB pixel.
/// \returns float - greyscale value.
float operator()(visioncpp::pixel::F32C3 in) {
return 0.299f * in[0] + 0.587f * in[1] + 0.114f * in[2];
}
};// converting unsigned char value to normalised float value
auto node = visioncpp::point_operation<MyNormaliseFunctor>(data);
// float RGB to float Grey conversion
auto node2 = visioncpp::point_operation<MyGreyFunctor>(node);// assign operation that writes output of the pipe to output terminal node
auto pipe = visioncpp::assign(data_out, node2);// execute the pipe defined pipe
// 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 \nGrey: %f \n", in_rgb.get()[0], in_rgb.get()[1], in_rgb.get()[2], out_grey.get()[0]);##Summary: A summary what was done that it is need to be done in all VisionCpp applications.
| Back | FazBrowse Home | New Git URL |