2017-02-04 20 views
2

我正在比较OpenCL UMat与OpenCL Mat,我运行了cvtColor()函数500次。OpenCL copyto()消耗更多时间

int OpenCL_UMat() 
{ 
    Mat img; 
    UMat uimage, U1; 
    img = imread("image_path"); 
    for (int i = 1; i < 500; i++) 
    { 
     img.copyTo(uimage); // Here it takes 1 sec 
     cvtColor(uimage, U1, CV_BGR2GRAY); 
    } 
    imshow("image1", U1); 
    return 0; 
} 

int OpenCL_Mat() 
{ 
    Mat img, img1; 
    img = imread("image_path"); 
    for (int i = 1; i < 500; i++) 
    { 
     cvtColor(img, img1, CV_BGR2GRAY); 
    } 
    imshow("image1", img); 
    return 0; 
} 

输出用于以微秒为单位的代码是
_________________________________
| OpenCL UMat = 2368720微秒 -
| _________________________________ |
| OpenCL Mat = 312200微秒---- |
| _________________________________ |

从上面的代码中我发现copyto()函数需要时间从RAM加载图像到GPU,所以当copyto()函数运行时,它会消耗1秒来执行。

有什么选择,我可以直接使用UMat。
像这样
UMat img = imread("image_path");

回答

2

您可以使用

UMat img = imread("image_path").getUMat(ACCESS_READ); 
+1

谢谢你的回复。我如何继续使用网络摄像机?当使用VideoCapture时,我们不能使用'.getUmat(ACCESS_READ)'。 –

+1

@SurakshaAjith VideoCapture重载了提取操作符'virtual VideoCapture&operator >>(UMat&image)',所以你可以得到这样一个帧:'capture >> frame'。 – w1ck3dg0ph3r