1

我想将图像上传到以下变量gpu::GpuMat test;中。首先将输入图像(src)转换为灰度图像cvtColor( src, src_gray, COLOR_BGR2GRAY );,然后上传test.upload(src_gray);。不幸的是,上传花了很多时间。两分钟多。图像尺寸为 169x90。我知道由于带宽的原因通常会有一些延迟,但我认为两分钟对于这么小的图像来说太多了。最后,我想提一下,在上传第一张图片后,下一张图片的上传几乎是即时的。有初始化程序吗?我们可以改善这种延迟吗?

int main( int, char** argv )
{
/// Load source image and convert it to gray
string filename =  argv[1] ;//"yourfile.avi";
VideoCapture capture(filename);
if( !capture.isOpened() )
    throw "Error when reading steam_avi";

int framenumber=1;
Mat src, src_gray;
gpu::GpuMat test;

namedWindow( "w", 1);
time_t start,end;
time (&start);
for( ; ; )
{
    //printf("Frame %d: \n", framenumber++ );
    capture >> src;

    cvtColor( src, src_gray, COLOR_BGR2GRAY );

    test.upload(src_gray);//it takes too long even for an image of 169x90
    if( src_gray.empty() )
        break;
    imshow("w", src_gray);



    waitKey(20); // waits to display frame

}
time (&end);
double dif = difftime (end,start);
printf ("Elasped time is %.2lf seconds.", dif );
getchar();

return(0);
}

在此处输入图像描述

带有--memory=pageable参数。

PS:Win 7 64x,CUDA SDK 5.5,Opencv 2.4.6,GeForce 9600。

4

2 回答 2

5

由于 CUDA 上下文初始化,任何 gpu 函数的第一次调用都很慢。所有下一个调用都会更快。在时间测量之前调用一些 gpu 函数:

gpu::GpuMat test;
test.create(1, 1, CV_8U); // Just to initialize context
time(&start);
...
time(&end);
于 2013-10-18T16:48:00.943 回答
1

CUDA 上下文初始化最多需要几秒钟,超过几分钟的延迟是由于您的 OpenCV 二进制代码不支持您的 NVidia 卡。要解决这个问题,你必须重建你的 opencv libaray。

首先,编辑opencv/cmake/OpenCVDetecCUDA.cmake,找到这一行:

if(NOT DEFINED __cuda_arch_bin)

在上面的行之前添加以下两行:

...
set(__cuda_arch_bin "3.5 5.0")
set(__cuda_arch_ptx "3.5 5.0")

if(NOT DEFINED __cuda_arch_bin)
...

然后,重建并重新安装您的 opencv:

cd opencv/build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 ..
make -j8
make install
于 2016-10-16T11:35:10.697 回答