设备:仿生眼
在使用仿生眼生成深度图像命令时:
// do stereo matching 双目矫正之后,进行立体匹配
sgm->virtualCalc(vimgL_rect,vimgR_rect,vQ,disp,depth,mask); //这个disp返回的应该是视差的值,怎么转化为深度呢
//深度是后续根据基线长度的操作。这里只展示了深度图
sgm->disp32fTo8u(disp,disp_8u);
disp_8u.convertTo(disp_8u, CV_8U, 1.0);
cv::applyColorMap(disp_8u, disp_color, cv::COLORMAP_JET);
cv::imshow("disp", disp_color);
会报错:
cuda error /home/be/workspace/libSGM/src/median_filter.cu : 288 no kernel image is available for execution on the device
并且无法产生图像。
解决方法
这个问题说明项目里面的动态库链接的位置或者是动态库本身有问题。
可以用下面的命令查看动态库的链接位置:
ldd evo_be_Sample_StereoRectify_2004 | grep sgm
这个命令通过 | grep sgm 抓取到项目 evo_be_Sample_StereoRectify_2004 所包含的链接库中有字母 sgm 的动态库。
可以得到:
be@be:~/workspace/BionicEyes/bin$ ldd evo_be_Sample_StereoRectify_2004 | grep sgm
// 得到的结果
libsgm_shared.so => /usr/Evo_BionicEyes/dependencies/libSGM-2.7.0/lib/2004/CV_4/libsgm_shared.so (0x00007faf680ed000)
这个 libsgm_shared.so 就是项目链接的动态库。
我这个问题不是动态链接库的位置问题。而是这个动态链接库在编译的时候的 CUDA 版本太旧,导致这个动态库在换到别的电脑上面使用时,出现了问题。
换一个 CUDA 版本编译得到这个动态链接库后,问题解决。