From 5f00a1ba9075f3bc8d41f233c77226c856dc3db5 Mon Sep 17 00:00:00 2001 From: Kevron Rees Date: Fri, 6 Sep 2013 00:00:38 -0700 Subject: [PATCH] added cuda support for opencv plugin --- examples/opencvdbusconfig | 1 + examples/opencvluxconfig | 1 + plugins/examplesink.cpp | 1 + plugins/opencvlux/CMakeLists.txt | 9 ++++++ plugins/opencvlux/README | 9 ++++++ plugins/opencvlux/opencvluxplugin.cpp | 53 +++++++++++++++++++++++++++++++++-- plugins/opencvlux/opencvluxplugin.h | 1 + 7 files changed, 73 insertions(+), 2 deletions(-) diff --git a/examples/opencvdbusconfig b/examples/opencvdbusconfig index 4cc9e4f..9b326b6 100644 --- a/examples/opencvdbusconfig +++ b/examples/opencvdbusconfig @@ -4,6 +4,7 @@ "name" : "OpenCV LUX", "path" : "/usr/lib/automotive-message-broker/opencvluxplugin.so", "threaded" : "true", + "cuda" : "true", "fps" : "30", "pixelLowerBound" : "18", "pixelUpperBound" : "255", diff --git a/examples/opencvluxconfig b/examples/opencvluxconfig index d0c01b1..27b6cd7 100644 --- a/examples/opencvluxconfig +++ b/examples/opencvluxconfig @@ -7,6 +7,7 @@ "threaded" : "true", "kinect" : "false", "opencl" : "false", + "cuda" : "false", "pixelLowerBound" : "0", "pixelUpperBound" : "255", "fps" : "30", diff --git a/plugins/examplesink.cpp b/plugins/examplesink.cpp index 5c1fb0a..ef05d16 100644 --- a/plugins/examplesink.cpp +++ b/plugins/examplesink.cpp @@ -36,6 +36,7 @@ ExampleSink::ExampleSink(AbstractRoutingEngine* engine, map conf routingEngine->subscribeToProperty(VehicleProperty::VehicleSpeed, this); routingEngine->subscribeToProperty(VehicleProperty::Latitude, this); routingEngine->subscribeToProperty(VehicleProperty::Longitude, this); + routingEngine->subscribeToProperty(VehicleProperty::ExteriorBrightness, this); supportedChanged(engine->supported()); } diff --git a/plugins/opencvlux/CMakeLists.txt b/plugins/opencvlux/CMakeLists.txt index c965c62..17ebedb 100644 --- a/plugins/opencvlux/CMakeLists.txt +++ b/plugins/opencvlux/CMakeLists.txt @@ -18,6 +18,15 @@ else(ocl) message(STATUS "no opencv ocl headers found (ocl.hpp). no opencl support") endif(ocl) +find_path(cuda gpu.hpp PATH_SUFFIXES opencv/gpu opencv2/gpu DOC "opencv cuda headers") + +if(cuda) + message(STATUS "found opencv cuda headers. enabling cuda support. ${cuda}") + add_definitions(-DCUDA) +else(cuda) + message(STATUS "no opencv cuda headers found. no cuda support") +endif(cuda) + include_directories(${CMAKE_SOURCE_DIR}/lib ${include_dirs} ${OpenCV_INCLUDE_DIRS}) set(opencvluxplugin_headers opencvluxplugin.h) diff --git a/plugins/opencvlux/README b/plugins/opencvlux/README index 76cad19..4722213 100644 --- a/plugins/opencvlux/README +++ b/plugins/opencvlux/README @@ -74,3 +74,12 @@ NOTE: This option has not been tested because at implementation, OpenCL 1.2 was on-hand. Default: "false" + +"cuda" +Use nvidia cuda gpu processing to process image data. This will only work if OpenCV was compiled with +cuda support. + +NOTE: this does not appear to have a noticable impact on processing given the way we are using it. +this does however make memory usage explode. + +Default: "false" diff --git a/plugins/opencvlux/opencvluxplugin.cpp b/plugins/opencvlux/opencvluxplugin.cpp index 142ced4..d2181f0 100644 --- a/plugins/opencvlux/opencvluxplugin.cpp +++ b/plugins/opencvlux/opencvluxplugin.cpp @@ -26,6 +26,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include #endif +#ifdef CUDA +#include +#endif + using namespace std; #include "debugout.h" @@ -43,6 +47,7 @@ OpenCvLuxPlugin::OpenCvLuxPlugin(AbstractRoutingEngine* re, map shared->threaded = false; shared->kinect = false; shared->useOpenCl = false; + shared->useCuda = false; shared->fps=30; device="0"; @@ -94,15 +99,42 @@ OpenCvLuxPlugin::OpenCvLuxPlugin(AbstractRoutingEngine* re, map shared->useOpenCl = config["opencl"] == "true"; } + if(config.find("cuda") != config.end()) + { + shared->useCuda = config["cuda"] == "true"; + } + #ifdef OPENCL - if(useOpenCl) + if(shared->useOpenCl) { std::vector info; cv::ocl::getDevice(info); } #endif +#ifdef CUDA + if(shared->useCuda) + { + int devices = cv::gpu::getCudaEnabledDeviceCount(); + DebugOut()<<"There are "<useCuda = false; + } + } +#endif + } @@ -172,7 +204,6 @@ PropertyList OpenCvLuxPlugin::supported() { PropertyList props; props.push_back(VehicleProperty::ExteriorBrightness); - return props; } @@ -225,6 +256,24 @@ static uint evalImage(cv::Mat qImg, OpenCvLuxPlugin::Shared *shared) cv::ocl::meanStdDev(qImg, avgPixelIntensity, stdDev); #endif } + else if(shared->useCuda) + { +#ifdef CUDA + cv::gpu::GpuMat src(qImg), dest; + cv::gpu::cvtColor(src, dest, CV_BGR2GRAY); + cv::Scalar stdDev; + try + { + + cv::gpu::meanStdDev(dest, avgPixelIntensity, stdDev); + } + catch(...) + { + DebugOut(DebugOut::Error)<<"CUDA pixel intensity calculation failed."<