Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

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

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

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

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