2015-12-22 106 views
1

我在ubuntu 14.04中使用opencv 3.0.0。 我安裝了AMD Catalyst視頻驅動程序,在OpenCL上使用OpenCV。OpenCV 3.0錯誤包括ocl.hpp

/etc/OpenCL/vendor通過「libamdocl32.so」和「libamdocl64.so」具有「amdocl32.icd amdocl64」.icd。

在OpenCV的cmake的文件,OpenCV的表現爲:

-- OpenCV modules: 
--  To be built:     hal core flann imgproc ml photo video imgcodecs shape videoio highgui objdetect superres ts features2d calib3d stitching videostab 
--  Disabled:     world 
--  Disabled by dependency:  - 
--  Unavailable:     cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 python3 viz 
-- OpenCL: 
--  Version:      dynamic 
--  Include path:    /home/eduardo/Install-OpenCV/Ubuntu/OpenCV/opencv-3.0.0/3rdparty/include/opencl/1.2 
--  Use AMDFFT:     NO 
--  Use AMDBLAS:     NO 
--  Use OpenCL:     YES 

當我包括ocl.hpp文件在我謨(#包括)。編譯器返回他的信息:

In file included from main.cpp:11:0: 
/usr/include/opencv2/ocl/ocl.hpp: In member function ‘cv::ocl::Hamming::ResultType cv::ocl::Hamming::operator()(const unsigned char*, const unsigned char*, int) const’: 
/usr/include/opencv2/ocl/ocl.hpp:1170:46: error: ‘normHamming’ was not declared in this scope 
       return normHamming(a, b, size); 
             ^
/usr/include/opencv2/ocl/ocl.hpp:1170:46: note: suggested alternative: 
In file included from /usr/local/include/opencv2/core/base.hpp:56:0, 
       from /usr/local/include/opencv2/core.hpp:54, 
       from /usr/local/include/opencv2/core/core.hpp:48, 
       from /usr/include/opencv2/ocl/ocl.hpp:50, 
       from main.cpp:11: 
/usr/local/include/opencv2/hal.hpp:70:5: note: ‘cv::hal::normHamming’ 
int normHamming(const uchar* a, const uchar* b, int n, int cellSize); 
    ^
In file included from main.cpp:11:0: 
/usr/include/opencv2/ocl/ocl.hpp: At global scope: 
/usr/include/opencv2/ocl/ocl.hpp:1932:9: error: expected class-name before ‘{’ token 
     { 
     ^
/usr/include/opencv2/ocl/ocl.hpp:1950:9: error: expected class-name before ‘{’ token 
     { 
     ^
/usr/include/opencv2/ocl/ocl.hpp:1956:23: error: ‘CvSVMParams’ has not been declared 
         CvSVMParams params=CvSVMParams()); 
        ^
/usr/include/opencv2/ocl/ocl.hpp:1956:54: error: ‘CvSVMParams’ was not declared in this scope 
         CvSVMParams params=CvSVMParams()); 
                ^
make: *** [main.o] Error 1` 

我需要在GPU上測試侵蝕和擴張過濾器。

有人知道爲什麼會發生這種情況?

回答

0

您不應將ocl.hpp納入基於OpenCV 3.0的項目中,以使用ocl::function_name表示法。

編輯:another ocl.hpp的OpenCV 3.0 - 其意義是完全不同2.4分支:在後一種情況下,存在所有的OpenCL充電函數定義,以及在的OpenCV 3.0它是平臺,上下文和設備相關的信息或調整。它可以包含以下命令:

#include <opencv2/core/ocl.hpp> 

ocl.hpp/usr/include/拍攝 - 看來你也有安裝在您的系統中的一些OpenCV的2.4.x的開發包 - 這是一個不同的分支,爲了更好的通關請刪除所有libopencv*-dev包。如果您只想使用3.0版本,它將幫助您(將刪除不明確的標題)。

您應該在cmake <your opencv 3.0 source dir>make之後運行make install - 它會將所有必需的東西安裝到您的系統中。默認情況下,所有標題將位於/usr/local/include文件夾中。

+0

謝謝。 如果我不能使用ocl.hpp。如何獲取和設置設備? 如果真的OpenCV的是在像這樣的例子侵蝕和擴張功能,使用OpenCL的我不知道: http://opencv.org/platforms/opencl.html –

+0

現在** **的OpenCV採用隱式的OpenCL充電功能版本,如果它可以找到可用的OpenCL設備和庫。你可以實際檢查它是否使用OpenCL的任何函數只有特殊的** OpenCV **構建與標誌'CV_OPENCL_RUN_VERBOSE'(詳細看看[這個答案](http://stackoverflow.com/questions/34203627/opencv-3 -O-的OpenCL和 - meanshiftfiltering/34213354#34213354))。您也可以使用[ocl.hpp](https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/ocl.hpp)中的任何檢查 - 它具有*完全不同*感覺比** 2.4 **分支的'ocl.hpp'! – avtomaton

+0

@EduardoMartins:我更新了關於'ocl.hpp'的回答 - 抱歉給您帶來了不便,我以爲您嘗試使用** OpenCV 2.4.x **中的'ocl :: function_name'表示法。 – avtomaton