added cuda support for opencv plugin
authorKevron Rees <tripzero.kev@gmail.com>
Fri, 6 Sep 2013 07:00:38 +0000 (00:00 -0700)
committerKevron Rees <tripzero.kev@gmail.com>
Fri, 6 Sep 2013 07:01:27 +0000 (00:01 -0700)
examples/opencvdbusconfig
examples/opencvluxconfig
plugins/examplesink.cpp
plugins/opencvlux/CMakeLists.txt
plugins/opencvlux/README
plugins/opencvlux/opencvluxplugin.cpp
plugins/opencvlux/opencvluxplugin.h

index 4cc9e4f..9b326b6 100644 (file)
@@ -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",
index d0c01b1..27b6cd7 100644 (file)
@@ -7,6 +7,7 @@
                        "threaded" : "true",
                        "kinect" : "false",
                        "opencl" : "false",
+                       "cuda" : "false",
                        "pixelLowerBound" : "0",
                        "pixelUpperBound" : "255",
                        "fps" : "30",
index 5c1fb0a..ef05d16 100644 (file)
@@ -36,6 +36,7 @@ ExampleSink::ExampleSink(AbstractRoutingEngine* engine, map<string, string> conf
        routingEngine->subscribeToProperty(VehicleProperty::VehicleSpeed, this);
        routingEngine->subscribeToProperty(VehicleProperty::Latitude, this);
        routingEngine->subscribeToProperty(VehicleProperty::Longitude, this);
+       routingEngine->subscribeToProperty(VehicleProperty::ExteriorBrightness, this);
 
        supportedChanged(engine->supported());
 }
index c965c62..17ebedb 100644 (file)
@@ -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)
index 76cad19..4722213 100644 (file)
@@ -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"
index 142ced4..d2181f0 100644 (file)
@@ -26,6 +26,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 #include <opencv/ocl/ocl.hpp>
 #endif
 
+#ifdef CUDA
+#include <opencv2/gpu/gpu.hpp>
+#endif
+
 using namespace std;
 
 #include "debugout.h"
@@ -43,6 +47,7 @@ OpenCvLuxPlugin::OpenCvLuxPlugin(AbstractRoutingEngine* re, map<string, string>
        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<string, string>
                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<cv::ocl::Info> info;
                cv::ocl::getDevice(info);
        }
 #endif
 
+#ifdef CUDA
+       if(shared->useCuda)
+       {
+               int devices = cv::gpu::getCudaEnabledDeviceCount();
+               DebugOut()<<"There are "<<devices<<" CUDA devices on this system"<<endl;
+               if(devices)
+               {
+                       DebugOut()<<"We will use 0 as the default device"<<endl;
+                       cv::gpu::DeviceInfo info(0);
+                       DebugOut()<<"Cuda Device Name: "<<info.name()<<endl;
+                       DebugOut()<<"Version: "<<info.majorVersion()<<"major"<<info.minorVersion()<<"minor"<<endl;
+                       DebugOut()<<"Streaming processor count: "<<info.multiProcessorCount()<<endl;
+                       cv::gpu::setDevice(0);
+               }
+               else
+               {
+                       DebugOut(DebugOut::Warning)<<"No CUDA device found.  Disabling CUDA."<<endl;
+                       shared->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."<<endl;
+               }
+
+#endif
+       }
        else
        {
                avgPixelIntensity = cv::mean(qImg);
index f59a2a4..2d0af7b 100644 (file)
@@ -42,6 +42,7 @@ public:
                bool threaded;
                bool kinect;
                bool useOpenCl;
+        bool useCuda;
                int pixelLowerBound;
                int pixelUpperBound;
        };