Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

asked May 27 '14

chaanakya gravatar image

OpenCL in OpenCV 3.0.0

I'm attempting to use OpenCV 3.0.0 (yes, I know it's a development version) to work with OpenCL. I'm using the UMat structure instead of the ocl::oclMat structure found in earlier versions. As expected, those matrices are getting created on the GPU side. However, when I attempt to run GaussianBlur for example on those matrices, things slow down to a crawl. Earlier, this would have been solved by using ocl::GaussianBlur, but that does not exist anymore. How is one supposed to achieve this in OpenCV 3.0?

Thank you very much!

Sincerely,

Chaanakya

click to hide/show revision 2
No.2 Revision

OpenCL in OpenCV 3.0.0

I'm attempting to use OpenCV 3.0.0 (yes, I know it's a development version) to work with OpenCL. I'm using the UMat structure instead of the ocl::oclMat structure found in earlier versions. As expected, those matrices are getting created on the GPU side. However, when I attempt to run GaussianBlur for example on those matrices, things slow down to a crawl. Earlier, this would have been solved by using ocl::GaussianBlur, but that does not exist anymore. How is one supposed to achieve this in OpenCV 3.0?

EDIT

Now that I have ostensibly enabled using OpenCL for dealing with UMats, things are still slowing down to a crawl. Here is the code that I am currently using to test this out:

#include "opencv2/opencv.hpp"
#include "opencv2/core/ocl.hpp"
#include <iostream>
#include <unistd.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
  ocl::setUseOpenCL(true);
  UMat gpuFrame;
  Mat gpuEdges;
  VideoCapture cap(0); // open the default camera
  if(!cap.isOpened())  // check if we succeeded
    return -1;
  namedWindow("edges",1);
  for(;;)
    {
      cap >> gpuFrame; // get a new frame from camera
      cvtColor(gpuFrame, gpuFrame, COLOR_BGR2GRAY);
      // GaussianBlur(gpuFrame, gpuEdges, Size(1,1), 1.5, 1.5);
      Canny(gpuFrame, gpuEdges, 0, 30, 3);
      imshow("edges", gpuEdges);
      sleep(1/30.0);
      if(waitKey(30) >= 0) break;
    }
  // the camera will be deinitialized automatically in VideoCapture destructor
  return 0;
}

Thank you very much!

Sincerely,

Chaanakya

click to hide/show revision 3
No.3 Revision

OpenCL in OpenCV 3.0.0

I'm attempting to use OpenCV 3.0.0 (yes, I know it's a development version) to work with OpenCL. I'm using the UMat structure instead of the ocl::oclMat structure found in earlier versions. As expected, those matrices are getting created on the GPU side. However, when I attempt to run GaussianBlur for example on those matrices, things slow down to a crawl. Earlier, this would have been solved by using ocl::GaussianBlur, but that does not exist anymore. How is one supposed to achieve this in OpenCV 3.0?

EDIT

Now that I have ostensibly enabled using OpenCL for dealing with UMats, things are still slowing down to a crawl. Here is the code that I am currently using to test this out:

#include "opencv2/opencv.hpp"
#include "opencv2/core/ocl.hpp"
#include <iostream>
#include <unistd.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
  ocl::setUseOpenCL(true);
  UMat gpuFrame;
  Mat UMat gpuEdges;
  VideoCapture cap(0); // open the default camera
  if(!cap.isOpened())  // check if we succeeded
    return -1;
  namedWindow("edges",1);
  for(;;)
    {
      cap >> gpuFrame; // get a new frame from camera
      cvtColor(gpuFrame, gpuFrame, COLOR_BGR2GRAY);
      // GaussianBlur(gpuFrame, gpuEdges, Size(1,1), 1.5, 1.5);
      Canny(gpuFrame, gpuEdges, 0, 30, 3);
      imshow("edges", gpuEdges);
      sleep(1/30.0);
      if(waitKey(30) >= 0) break;
    }
  // the camera will be deinitialized automatically in VideoCapture destructor
  return 0;
}

Thank you very much!

Sincerely,

Chaanakya

OpenCL in OpenCV 3.0.0

I'm attempting to use OpenCV 3.0.0 (yes, I know it's a development version) to work with OpenCL. I'm using the UMat structure instead of the ocl::oclMat structure found in earlier versions. As expected, those matrices are getting created on the GPU side. However, when I attempt to run GaussianBlur for example on those matrices, things slow down to a crawl. Earlier, this would have been solved by using ocl::GaussianBlur, but that does not exist anymore. How is one supposed to achieve this in OpenCV 3.0?

EDIT

Now that I have ostensibly enabled using OpenCL for dealing with UMats, things are still slowing down to a crawl. Here is the code that I am currently using to test this out:

#include "opencv2/opencv.hpp"
#include "opencv2/core/ocl.hpp"
#include <iostream>
#include <unistd.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
  ocl::setUseOpenCL(true);
  UMat gpuFrame;
  UMat gpuEdges;
  VideoCapture cap(0); // open the default camera
  if(!cap.isOpened())  // check if we succeeded
    return -1;
  namedWindow("edges",1);
  for(;;)
    {
      cap >> gpuFrame; // get a new frame from camera
      cvtColor(gpuFrame, gpuFrame, COLOR_BGR2GRAY);
      // GaussianBlur(gpuFrame, gpuEdges, Size(1,1), 1.5, 1.5);
      Canny(gpuFrame, gpuEdges, 0, 30, 3);
      imshow("edges", gpuEdges);
      sleep(1/30.0);
      if(waitKey(30) >= 0) break;
    }
  // the camera will be deinitialized automatically in VideoCapture destructor
  return 0;
}

EDIT 2

Changing the gpuFrame to be a regular matrix seems to have solved the issue. Thank you! :)

Thank you very much!

Sincerely,

Chaanakya

click to hide/show revision 5
not solved

OpenCL in OpenCV 3.0.0

I'm attempting to use OpenCV 3.0.0 (yes, I know it's a development version) to work with OpenCL. I'm using the UMat structure instead of the ocl::oclMat structure found in earlier versions. As expected, those matrices are getting created on the GPU side. However, when I attempt to run GaussianBlur for example on those matrices, things slow down to a crawl. Earlier, this would have been solved by using ocl::GaussianBlur, but that does not exist anymore. How is one supposed to achieve this in OpenCV 3.0?

EDIT

Now that I have ostensibly enabled using OpenCL for dealing with UMats, things are still slowing down to a crawl. Here is the code that I am currently using to test this out:

#include "opencv2/opencv.hpp"
#include "opencv2/core/ocl.hpp"
#include <iostream>
#include <unistd.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
  ocl::setUseOpenCL(true);
  Mat gpuFrame;
  UMat gpuFrame;
gpuBW;
  UMat gpuBlur;
  UMat gpuEdges;
  VideoCapture cap(0); // open the default camera
  if(!cap.isOpened())  // check if we succeeded
    return -1;
  namedWindow("edges",1);
  for(;;)
    {
      cap >> gpuFrame; // get a new frame from camera
      cvtColor(gpuFrame, gpuFrame, gpuBW, COLOR_BGR2GRAY);
      // GaussianBlur(gpuFrame, gpuEdges, GaussianBlur(gpuBW, gpuBlur, Size(1,1), 1.5, 1.5);
      Canny(gpuFrame, Canny(gpuBlur, gpuEdges, 0, 30, 3);
      imshow("edges", gpuEdges);
      sleep(1/30.0);
      if(waitKey(30) >= 0) break;
    }
  // the camera will be deinitialized automatically in VideoCapture destructor
  return 0;
}

EDIT 2

Changing the gpuFrame to be a regular matrix seems to have solved the issue. Thank you! :)

Edit 3

I seem to have spoken too soon --- changing gpuFrame to a regular Mat object fixed everything because everything then became CPU computations! Why is it that I cannot do multiple computations using OpenCL and not have the GPU freeze up? In my dmesg, it says the following whenever I run my program:

[670017.262677] [drm] Enabling RC6 states: RC6 on, RC6p off, RC6pp off
[670025.273070] [drm] stuck on render ring
[670025.273999] [drm] GPU HANG: ecode 0:0x8fd8ffff, in VideoCapture [26945], reason: Ring hung, action: reset
[670027.274692] [drm] Enabling RC6 states: RC6 on, RC6p off, RC6pp off
[670031.265908] [drm] stuck on render ring
[670031.266856] [drm] GPU HANG: ecode 0:0x8fd8ffff, in VideoCapture [26945], reason: Ring hung, action: reset
[670031.266984] [drm:i915_context_is_banned] *ERROR* gpu hanging too fast, banning!
[670033.267655] [drm] Enabling RC6 states: RC6 on, RC6p off, RC6pp off

This seems to suggest that my loop is going too quickly. But the GPU should be quicker at computations (especially matrix computations) than a CPU, right? So what's going on?

Thank you very much!

Sincerely,

Chaanakya