OPENCV和CUDA混合编程图像处理问题error LNK2001: 无法解析的外部符号 "public: static struct CUstream_st

我的零食吃完了 2015-05-05 10:08:44
OPENCV和CUDA混合编程图像处理问题
DEBUG时出现下面的问题,怀疑是库文件缺失,可是都是按照经典的OPENCV配置方式啊,建立工程后也测试了,可以调用opencv的库,可是下面这个问题是出在哪呢?求助大神啊!!!!
“error LNK2001: 无法解析的外部符号 "public: static struct CUstream_st * __cdecl cv::gpu::StreamAccessor::getStream(class cv::gpu::Stream const &)" (?getStream@StreamAccessor@gpu@cv@@SAPAUCUstream_st@@ABVStream@23@@Z)”


源代码:
//main.cpp

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>

#pragma comment(lib,"opencv_gpu2410d.lib")
#pragma comment(lib,"opencv_core2410d.lib")
#pragma comment(lib,"opencv_highgui2410d.lib")

using namespace cv;
using namespace cv::gpu;

extern "C" void swap_rb(const GpuMat& src,GpuMat& dst,Stream& stream = Stream::Null());//

int main()
{
Mat image = imread("lena.jpg");
imshow("src",image);
waitKey();
GpuMat gpuMat,output;

gpuMat.upload(image);
swap_rb(gpuMat,output);
output.download(image);

imshow("gpu",image);
getchar();
waitKey(0);
return 0;
}


//swap.cpp



#include <opencv2/gpu/gpu.hpp>
#include <opencv2/gpu/stream_accessor.hpp>


using namespace cv;
using namespace cv::gpu;

extern "C" void swap_rb_caller(const PtrStepSz<uchar3>& src,PtrStep<uchar3> dst,cudaStream_t stream);//

extern "C" void swap_rb(const GpuMat& src,GpuMat& dst,Stream& stream = Stream::Null())//
{
CV_Assert(src.type() == CV_8UC3);
dst.create(src.size(),src.type());
cudaStream_t s = StreamAccessor::getStream(stream);
swap_rb_caller(src,dst,s);//
}



//swap.cu


#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <opencv2/core/cuda_devptrs.hpp>
using namespace cv;
using namespace cv::gpu;

//自定义内核函数
__global__ void swap_rb_kernel(const PtrStepSz<uchar3> src,PtrStep<uchar3> dst)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;

if(x < src.cols && y < src.rows)
{
uchar3 v = src(y,x);
dst(y,x) = make_uchar3(v.z,v.y,v.x);
}
}

extern "C" void swap_rb_caller(const PtrStepSz<uchar3>& src,PtrStep<uchar3> dst,cudaStream_t stream)//
{
dim3 block(32,8);
dim3 grid((src.cols + block.x - 1)/block.x,(src.rows + block.y - 1)/block.y);

swap_rb_kernel<<<grid,block,0,stream>>>(src,dst);//
if(stream == 0)
cudaDeviceSynchronize();
}


...全文
3947 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tengwl 2016-03-12
  • 打赏
  • 举报
回复
引用 7 楼 qq_30966321 的回复:
楼主你好。 opencv中GpuMat.upload(image)这一句很耗时啊,我的机子大概要800ms。。请问楼主是如何解决这耗时问题的?
是不是cuda的初始化的时间也算上了?可以执行2次这个函数,取第二次的运行时间
qq_30966321 2016-01-20
  • 打赏
  • 举报
回复
楼主你好。 opencv中GpuMat.upload(image)这一句很耗时啊,我的机子大概要800ms。。请问楼主是如何解决这耗时问题的?
  • 打赏
  • 举报
回复
问题解决了,回复三楼,这个函数是属于OpenCv的gpu库里的,按照OpenCv官方版本提供的安装包库下载下来后,正确配置好相关的include和lib以及链接器和环境变量后,表面上看起来似乎已经include了那个OpenCv的GPU库,可是,那只是个空壳,里面没有实质的内容。原因在于OpenCv公司面对客服编译生成的库文件是针对大部分用户而言的,没有勾选上gpu库,所以,我们必须用CMAKE自己重新编译一下OpenCv提供的Source文件,并勾选上GPU库,重新生成自己的OpenCv的Lib。然后重新INCLUDE到目录中来,一切OK!!!
Spidey212 2015-05-07
  • 打赏
  • 举报
回复
StreamAccessor::getStream();这个函数是哪个库里的?有没包含进去?用的静态库版本对不对?
YCMyTot 2015-05-07
  • 打赏
  • 举报
回复
顺便问一下,OpenCV的GPU模块的加速比怎么样?
YCMyTot 2015-05-07
  • 打赏
  • 举报
回复
多谢楼主分享!
  • 打赏
  • 举报
回复
各路大神帮忙解答一下吧
  • 打赏
  • 举报
回复
代码源自http://blog.csdn.net/wangyaninglm/article/details/40394395的帖子,多谢!

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧