2014-10-21 1 views
-1

когда я пытаюсь скомпилировать проект cudastereo я получаю 40 ошибок, как это:OpenCV 3.0.0 альфа с Cuda 6.5, CudaStereo Error (Visual x64 Sutdio 2013)

Error 46 error : calling a __host__ function("fmin<int, float> ") from a __global__ function("cv::cuda::device::stereocsbp::init_data_cost<short, (int)1> ") is not allowed D:\ImageProcessing\GPU\opencv\sources\modules\cudastereo\src\cuda\stereocsbp.cu 219 opencv_cudastereo 1 

могли бы вы мне помочь. , кстати, все остальные проекты cuda в opencv успешно компилируются, и это точная функция, которая мне нужна в opencv, которая не компилируется.

Я считаю, что проблема заключается в вызове этих функций:

 template<> __device__ __forceinline__ static float pixeldiff<1>(const uchar* left, const uchar* right, float max_data_term) 
    { 
     return fmin(::abs((int)*left - *righ), max_data_term); 
    } 
    template<> __device__ __forceinline__ static float pixeldiff<3>(const uchar* left, const uchar* right, float max_data_term) 
    { 
     float tb = 0.114f * ::abs((int)left[0] - right[0]); 
     float tg = 0.587f * ::abs((int)left[1] - right[1]); 
     float tr = 0.299f * ::abs((int)left[2] - right[2]); 

     return fmin(tr + tg + tb, max_data_term); 
    } 
    template<> __device__ __forceinline__ static float pixeldiff<4>(const uchar* left, const uchar* right, float max_data_term) 
    { 
     uchar4 l = *((const uchar4*)left); 
     uchar4 r = *((const uchar4*)right); 

     float tb = 0.114f * ::abs((int)l.x - r.x); 
     float tg = 0.587f * ::abs((int)l.y - r.y); 
     float tr = 0.299f * ::abs((int)l.z - r.z); 

     return fmin(tr + tg + tb, max_data_term); 
    } 
+1

Вы должны показать свои коды. – Raptor

+0

Это не мой собственный код, его библиотека opencv. проблема в файле stereocsbp.cu. Я ничего не изменил в оригинальной библиотеке Opencv. – Jack

+1

, тогда спросите автора. – Raptor

ответ

1

Проблема была в первой функции, поэтому я изменил его

 template<> __device__ __forceinline__ static float pixeldiff<1>(const uchar* left, const uchar* right, float max_data_term) 
    { 

     float tempfloat = ::abs((int)*left - *right); 
     return fmin(tempfloat, max_data_term); 

    } 
0

нужно удалить статическое объявление

шаблон < >устройствоforceinline float pixe ldiff < 1> (const uchar * left, const uchar * right, float max_data_term) { .....