Слишком медленная загрузка GpuMat небольшого изображения

Я хочу загрузить изображение в следующую переменную 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: 
", 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.

opencv,gpu,

1

Ответов: 2


4

Первый вызов любой функции gpu медленный из-за инициализации контекста CUDA. Все последующие вызовы будут быстрее. Вызовите функцию gpu перед измерением времени:

gpu::GpuMat test;
test.create(1, 1, CV_8U); // Just to initialize context
time(&start);
...
time(&end);

1

Инициализация контекста CUDA в большинстве случаев занимает несколько секунд, задержка в течение нескольких минут связана с тем, что ваш двоичный код opencv не способен с вашей картой NVidia. Чтобы решить эту проблему, вы должны перестроить свой opavv 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
OpenCV, графический процессор,
Похожие вопросы