我想将图片上传到以下变量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。
答案 0 :(得分:5)
由于CUDA上下文初始化,任何gpu函数的第一次调用都很慢。所有下一个电话都会更快。在时间测量之前调用一些gpu函数:
gpu::GpuMat test;
test.create(1, 1, CV_8U); // Just to initialize context
time(&start);
...
time(&end);
答案 1 :(得分:1)
CUDA上下文初始化最多需要几秒钟,超过几分钟的延迟是由于你的opencv二进制代码无法使用你的NVidia卡。要解决此问题,您必须重建opencv libaray。
首先,编辑opencv / cmake / OpenCVDetecCUDA.cmake,找到该行:
...
set(__cuda_arch_bin "3.5 5.0")
set(__cuda_arch_ptx "3.5 5.0")
if(NOT DEFINED __cuda_arch_bin)
...
在上一行之前添加以下两行:
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
然后,重建并重新安装opencv:
var _URL = window.URL || window.webkitURL;
$("input[type=file]").change(function(e) {
var file;
if ((file = this.files[0])) {
var img = new Image();
img.onload = function () {
// do to on load
};
img.onerror = function () {
alert("valid format " + file.type);
};
img.src = _URL.createObjectURL(file);
}
});