opencv_flip.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //---------------------------------------------------------------------------//
  2. // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com>
  3. //
  4. // Distributed under the Boost Software License, Version 1.0
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // See http://boostorg.github.com/compute for more information.
  9. //---------------------------------------------------------------------------//
  10. #include <iostream>
  11. #include <opencv2/core/core.hpp>
  12. #include <opencv2/highgui/highgui.hpp>
  13. #include <opencv2/imgproc/imgproc.hpp>
  14. #include <boost/compute/system.hpp>
  15. #include <boost/compute/interop/opencv/core.hpp>
  16. #include <boost/compute/interop/opencv/highgui.hpp>
  17. #include <boost/compute/utility/source.hpp>
  18. namespace compute = boost::compute;
  19. // this example shows how to read an image with OpenCV, transfer the
  20. // image to the GPU, and apply a simple flip filter written in OpenCL
  21. int main(int argc, char *argv[])
  22. {
  23. // check command line
  24. if(argc < 2){
  25. std::cerr << "usage: " << argv[0] << " FILENAME" << std::endl;
  26. return -1;
  27. }
  28. // read image with opencv
  29. cv::Mat cv_image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
  30. if(!cv_image.data){
  31. std::cerr << "failed to load image" << std::endl;
  32. return -1;
  33. }
  34. // get default device and setup context
  35. compute::device gpu = compute::system::default_device();
  36. compute::context context(gpu);
  37. compute::command_queue queue(context, gpu);
  38. // convert image to BGRA (OpenCL requires 16-byte aligned data)
  39. cv::cvtColor(cv_image, cv_image, CV_BGR2BGRA);
  40. // transfer image to gpu
  41. compute::image2d input_image =
  42. compute::opencv_create_image2d_with_mat(
  43. cv_image, compute::image2d::read_write, queue
  44. );
  45. // create output image
  46. compute::image2d output_image(
  47. context,
  48. input_image.width(),
  49. input_image.height(),
  50. input_image.format(),
  51. compute::image2d::write_only
  52. );
  53. // create flip program
  54. const char source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(
  55. __kernel void flip_kernel(__read_only image2d_t input,
  56. __write_only image2d_t output)
  57. {
  58. const sampler_t sampler = CLK_ADDRESS_NONE | CLK_FILTER_NEAREST;
  59. int height = get_image_height(input);
  60. int2 input_coord = { get_global_id(0), get_global_id(1) };
  61. int2 output_coord = { input_coord.x, height - input_coord.y - 1 };
  62. float4 value = read_imagef(input, sampler, input_coord);
  63. write_imagef(output, output_coord, value);
  64. }
  65. );
  66. compute::program flip_program =
  67. compute::program::create_with_source(source, context);
  68. flip_program.build();
  69. // create flip kernel and set arguments
  70. compute::kernel flip_kernel(flip_program, "flip_kernel");
  71. flip_kernel.set_arg(0, input_image);
  72. flip_kernel.set_arg(1, output_image);
  73. // run flip kernel
  74. size_t origin[2] = { 0, 0 };
  75. size_t region[2] = { input_image.width(), input_image.height() };
  76. queue.enqueue_nd_range_kernel(flip_kernel, 2, origin, region, 0);
  77. // show host image
  78. cv::imshow("opencv image", cv_image);
  79. // show gpu image
  80. compute::opencv_imshow("filtered image", output_image, queue);
  81. // wait and return
  82. cv::waitKey(0);
  83. return 0;
  84. }