我正在尝试使用CUDA 6.5在Win 8.1机器上构建OpenCV 2.4.10。我还有其他第三方库,它们已成功安装。我推出一个简单的基于GPU的程序,我得到了这个错误No GPU found or the library was compiled without GPU support
。我还运行了在安装过程中构建的示例exe文件,如performance_gpu.exe
,我得到了同样的错误。我还检查了WITH_CUDA标志。以下是在CMAKE构建期间设置的标志(与CUDA相关)。
另一件事是,在一些帖子中,我已经读过,与CUDA一起构建需要花费大量时间。我的构建需要大约3小时,在编译.cu
文件期间占用最多时间。据我所知,在编译这些文件时我没有任何错误。
在一些帖子中,我看到人们在gpu
目录中谈论目录名build
,但我在我的内容中没有看到任何内容!
我正在使用Visual Studio 2013。
可能是什么问题?请帮忙!
更新
我再次尝试构建opencv,这次在开始构建之前,我添加了bin,lib和包含CUDA的目录。在E:\opencv\build\bin\Release
中构建之后,我运行了gpu_perf4au.exe
并获得了此输出
[----------]
[ INFO ] Implementation variant: cuda.
[----------]
[----------]
[ GPU INFO ] Run test suite on GeForce GTX 860M GPU.
[----------]
Time compensation is 0
OpenCV version: 2.4.10
OpenCV VCS version: unknown
Build type: release
Parallel framework: tbb
CPU features: sse sse2 sse3 ssse3 sse4.1 sse4.2 avx avx2
[----------]
[ GPU INFO ] Run on OS Windows x64.
[----------]
*** CUDA Device Query (Runtime API) version (CUDART static linking) ***
Device count: 1
Device 0: "GeForce GTX 860M"
CUDA Driver Version / Runtime Version 6.50 / 6.50
CUDA Capability Major/Minor version number: 5.0
Total amount of global memory: 2048 MBytes (2147483648 bytes)
GPU Clock Speed: 1.02 GHz
Max Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536,65536), 3
D=(4096,4096,4096)
Max Layered Texture Size (dim) x layers 1D=(16384) x 2048, 2D=(16384,16
384) x 2048
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per block: 1024
Maximum sizes of each dimension of a block: 1024 x 1024 x 64
Maximum sizes of each dimension of a grid: 2147483647 x 65535 x 65535
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and execution: Yes with 1 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Concurrent kernel execution: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support enabled: No
Device is using TCC driver mode: No
Device supports Unified Addressing (UVA): Yes
Device PCI Bus ID / PCI location ID: 1 / 0
Compute Mode:
Default (multiple host threads can use ::cudaSetDevice() with device simul
taneously)
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.50, CUDA Runtime Ver
sion = 6.50, NumDevs = 1
我认为每件事情都没问题,但在运行这个程序之后,我在其属性文件中包含了所有opencv和CUDA目录,
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\gpu\gpu.hpp>
using namespace std;
using namespace cv;
char key;
Mat thresholder (Mat input) {
gpu::GpuMat dst, src;
src.upload(input);
gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
Mat result_host(dst);
return result_host;
}
int main(int argc, char* argv[]) {
cvNamedWindow("Camera_Output", 1);
CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);
while (1){
IplImage* frame = cvQueryFrame(capture);
IplImage* gray_frame = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
cvCvtColor(frame, gray_frame, CV_RGB2GRAY);
Mat temp(gray_frame);
Mat thres_temp;
thres_temp = thresholder(temp);
//cvShowImage("Camera_Output", frame); //Show image frames on created window
imshow("Camera_Output", thres_temp);
key = cvWaitKey(10);
if (char(key) == 27){
break; //If you hit ESC key loop will break.
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("Camera_Output");
return 0;
}
我收到了错误:
OpenCV Error: No GPU support (The library is compiled without CUDA support) in E
mptyFuncTable::mallocPitch, file C:\builds\2_4_PackSlave-win64-vc12-shared\openc
v\modules\dynamicuda\include\opencv2/dynamicuda/dynamicuda.hpp, line 126
答案 0 :(得分:4)
感谢@BeRecursive让我领导解决了我的问题。 CMAKE构建日志有三个不可用的opencv模块,即androidcamera
,dynamicuda
和viz
。我找不到关于dynamicuda
的任何信息,即模块的不可用性可能导致我在问题中提到的错误。相反,我搜索了viz
模块并检查了它是如何安装的。
在浏览了一些博客和论坛后,我发现viz
模块未包含在OpenCV的pre-built
版本中。建议从源版本2.4.9构建。我想尝试一下,我用VS 2013和CMAKE 3.0.1安装它,但是有很多构建失败和警告。经过进一步搜索,我发现CMAKE版本3.0.x不建议用于构建OpenCV,因为它们会产生很多警告。
最后我决定切换到VS 2010和CMAKE 2.8.12.2并且在构建源代码后我没有错误,幸运的是在我运行我提到的程序之后在PATH中添加了所有可执行文件,库和DLL上面我没有错,但运行速度很慢!所以我运行了这个程序:
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\gpu\gpu.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
Mat thresholder(Mat input) {
cout << "Beginning thresholding using GPU" << endl;
gpu::GpuMat dst, src;
src.upload(input);
cout << "upload done ..." << endl;
gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
Mat result_host(dst);
cout << "Thresolding complete!" << endl;
return result_host;
}
int main(int argc, char** argv) {
Mat image, gray_image;
image = imread("desert.jpg", CV_LOAD_IMAGE_COLOR); // Read the file
if (!image.data) {
cout << "Could not open or find the image" << endl;
return -1;
}
cout << "Orignal image loaded ..." << endl;
cvtColor(image, gray_image, CV_BGR2GRAY);
cout << "Original image converted to Grayscale" << endl;
Mat thres_image;
thres_image = thresholder(gray_image);
namedWindow("Original Image", WINDOW_AUTOSIZE);// Create a window for display.
namedWindow("Gray Image", WINDOW_AUTOSIZE);
namedWindow("GPU Threshed Image", WINDOW_AUTOSIZE);
imshow("Original Image", image);
imshow("Gray Image", gray_image);
imshow("GPU Threshed Image", thres_image);
waitKey(0);
return 0;
}
后来我甚至测试了VS 2013上的构建,它也起作用了。
由于提到here的原因,基于GPU的程序很慢。
我想指出的三个重要事项:
注意:
opencv_gpu
之前的所有其他模块,然后构建ALL_BUILDS和INSTALL项目。WEB来源:
以下是帮助我解决问题的网络资源:
答案 1 :(得分:3)
这是OpenCV抛出的运行时错误。如果您查看previous question的CMake日志,可以看到其中一个不可用包是 dynamiccuda ,这似乎就是那个错误抱怨。
但是,我没有很多Windows OpenCV的经验,因此可能是一个红鲱鱼。我的直觉是,你没有在路径上正确地拥有所有的库。你确定在PATH上有CUDA lib / include / bin吗?您确定在路径上有OpenCV构建lib / include目录吗? Windows有一个非常简单的链接顺序,基本上只包括当前目录,PATH上的任何内容和主Windows目录。因此,我会尝试确保PATH上的所有内容都正确/您已将所有正确的库复制到文件夹中。
注意:这与编译/链接错误不同,因为它位于RUNTIME。因此,设置编译器路径无助于运行时链接错误。