TI官方给出的DLP-ALC-LIGHTCRAFTER-SDK使用的是mingw生成,但我希望能够在VS上实现编译,方便后续的调试。官方并不支持使用VS编译,网络上相关的资源也比较少。经过一个多星期的摸索,我终于使用VS2015成功编译。现将整个过程记录下来,希望能给有类似困惑的朋友们提供一些帮助。本次主要参考指南为 how to build dlp 3d sdk with vs2015.pptx,我也将按照PPT中的顺序,逐步进行(PPT来源以及下载地址我将放在文章末尾)。
一、系统与软件
- Win11 X64
- Visual Studio 2015
- Cmake 3.6.1
- OpenCV3.1.0
- FlyCapture 2.12.3.31 SDK - Windows (64-bit)
这里的软件版本是PPT中给出的,我也尝试过使用不同版本编译,但最终都没有成功。如果大家在使用不同版本编译过程中发生错误,可以尝试更换软件版本。
二、编译过程
1.使用cmake生成OpenCV
设置source和build的文件路径,选择VS 14 2015 win64进行configure。
在编译的过程中,如果Cmake出现如下图报错,是因为文件不完整,需要重新下载一个完整文件,放到对应的文件夹中,替换掉原来的缺损文件,文件夹路径位置可以参考PPT。(相关文件我会整理好放到文章末尾处)
这里需要注意,CMAKE第一次报错时,downloads文件夹中只有一个文件“89c783eee1c47bfc733f08334ec2e31c”,需要先将完整的opencv_ffmpeg.dll放入文件夹中进行替换,回到CMAKE中,再次点击configure,会继续报出关于另一个文件的错误。与此同时,downloads文件夹中也会出现新的文件35fe6ccdda6d7a04e9056b0d73b98e76,重复与上面同样的操作,替换为完整文件。以此类推,直至configure不再报错。
当configure不再报错后,勾选“BUILD_opencv_world”
然后将ws2_32.lib复制粘贴到C:/windows/System32/路径下,ws2_32.lib在电脑上有多个,我选择的是C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64\WS2_32.Lib。
configure无误后,点击generate。打开OpenCV.sln。
在工具栏中找到“生成”–>“批生成”,只勾选两处“INSTALL”,点击“生成”。这个过程耗时比较长。
编译成功82个,与PPT上的数量有出入,但具体原因我也没有搞清楚,如果有知道的朋友,恳请赐教!
最后,将文件路径F:\OpenCV3.1.0\OpenCV_bld\install\x64\vc14\bin添加到系统的环境变量中。
到这里,OpenCV的工作就结束了,如果大家在上述过程中遇到了其他问题,可以参考这篇文章
win10X64 + vs2015通过Cmake编译Opencv
https://blog.csdn.net/u013832707/article/details/53127710
2.使用cmake生成DLP SDk
首先依然是设置source和build的文件路径,选择VS 14 2015 win64进行configure。参照PPT或者我给出的图片进行路径设置,需要注意ws2_32.lib的路径,我这里参照PPT上的路径,将ws2_32.lib复制到了路径F:\TexasInstruments-DLP\DLP-ALC-LIGHTCRAFTER-SDK-2.0\DLP-ALC-LIGHTCRAFTER-SDK\3rd_party。
PG的路径需要先安装FlyCapture 2.12.3.31 SDK - Windows (64-bit) ,再去设置。
配置好路径后,点击configure,我这里会报错,显示缺少部分文件(我猜测可能就是我比PPT上少的那几个)。说一下我的解决办法:
报错显示找不到相应文件,所以我先试着在整个计算机上搜索同名文件,发现并没有,又试着去掉版本号“310”再次搜索,发现有“libopencv_calib3d2410.dll”,这个文件是我在按照TI官方给出的指导手册《DLP® Advanced Light Control Software Development Kit for Lightcrafter™ Evaluation Modules User’s Guide》,使用mingw编译OpenCV2.4.10产生的,所以我尝试使用同样的方法,使用mingw编译OpenCV3.1.0以获取缺少的文件(我将这些文件打包放到文末,大家可以下载使用)。
最后将对应文件复制到F:\OpenCV3.1.0\OpenCV_bld\bin路径下。
继续configure,仍报错显示缺少文件,这两个文件在老版本的SDK中存在,如FlyCapture_2.10.3.266_x86,所以我将两个dll文件从FlyCapture_2.10.3.266_x86复制到FlyCapture 2.12.3.31 SDK - Windows (64-bit)中(路径F:\FlyCapture2.12.3.31X64\bin64\vs2015),再次点击configure,没有错误。点击generate。(这两个文件也放在文章末尾)
打开DLP_SDK.sln,在批生成中选择DLP_SDK的两项,点击生成。
编译器报错:
错误1:
定位到报错位置,修改代码
std::istringstream ss(trimmed);
T result;
//long double number;
long number;//注释掉原来的(上一行),添加这一行代码
long long number_int;
switch(base){
case 8:
ss >> std::oct >> number_int; // Convert string to number
result = (T) number_int;
break;
case 16:
ss >> std::hex >> number_int; // Convert string to number
result = (T) number_int;
break;
case 10:
default:
ss >> std::dec >> number; // Convert string to number
result = (T) number;
}
参考帖子:
https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/869292/dlp-alc-lightcrafter-sdk-errors-in-other-hpp-c2440-conversion-cannot-convert-from-long-double-to-t-compiling-dlp-sdk-in-vs2017-debug-x64?tisearch=e2e-sitesearch&keymatch=DLP%25252525252520SDK#
错误2:
解决办法:
修改代码
在other.hpp中
template <typename T>
std::string ToString( T number ){
std::ostringstream ss;
ss << std::setprecision(NUM_TO_STRING_PRECISION);
//ss << number;
ss << (unsigned int) number;//注释掉原来的(上一行),添加这一行代码
return ss.str();
}
template <> std::string ToString<std::string>( std::string string );
template <> std::string ToString<char>( char number );
template <> std::string ToString<unsigned char>( unsigned char number );
template <> std::string ToString<float>(float number);//新加入的
}
在other.cpp中,大概301行处,添加下方代码
template <> std::string Number::ToString<float>(float number) {
std::ostringstream ss;
ss << number;
return ss.str();
}
参考帖子:
https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/818723/dlp-alc-lightcrafter-sdk-dlp-alc-lightcrafter-sdk/3084671?tisearch=e2e-sitesearch&keymatch=VS%20DLP#3084671
错误3:
解决方法:在末尾加一个return 0;
修改完成后,成功编译DLP_SDK
到这里,生成DLP_SDK的工作也结束了。
3.生成DLP 4500 APP
同样的,设置source和build路径,选择vs 2015 win64,点击configure
参照PPT设置各个路径以及CMAKE_CONFIGURATION_TYPES设为Release。
打开DLP_LCR4500_MV_APP.sln
如果编译后出现下面的报错,则需要在“附加依赖项”中添加setupapi.lib。
再次编译,没有错误
到这里,我认为编译已经基本成功了。
后来我又使用cmake重新生成DLP 4500 APP,将CMAKE_CONFIGURATION_TYPES设为Debug;Release;
但在使用Debug编译时,编译器报错如下图
报错的原因主要是在Debug中使用了release的库,需要将附加依赖项中的lib改为debug路径中的。
参考文章:https://blog.csdn.net/qq_41507735/article/details/126059788
这两个文件在DLP_SDK.sln中使用Debug编译一次,便会在F:\TexasInstruments-DLP\DLP-ALC-LIGHTCRAFTER-SDK-2.0_bld\lib\Debug路径下找到。
编译成功!
终于写到了文章结尾,这篇文章即是对我这一个多星期摸索的总结,也是希望对有同样困扰的朋友提供一些帮助。这是我第一次写博客,多有不足,希望大家多多包涵,如果有文中有出错的地方,欢迎大家批评指正,对我来说也是一个宝贵的学习交流的机会。我本科是机械专业,读研后由于课题需要,转到结构光领域,对于这个领域认识浅显,希望能和同好们多多交流。
三、参考文章及相关文件下载:
- how to build dlp 3d sdk with vs2015.pptx(TI论坛中给出的PPT,是本次最主要的参考)
文件来源:https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/749850/compiler-dlp4500-need-some-other-library
- 持久决心,win10X64 + vs2015通过Cmake编译Opencv
https://blog.csdn.net/u013832707/article/details/53127710
- TI官方论坛
https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/869292/dlp-alc-lightcrafter-sdk-errors-in-other-hpp-c2440-conversion-cannot-convert-from-long-double-to-t-compiling-dlp-sdk-in-vs2017-debug-x64?tisearch=e2e-sitesearch&keymatch=DLP%25252525252520SDK#
https://e2e.ti.com/support/dlp-products-group/dlp/f/dlp-products-forum/818723/dlp-alc-lightcrafter-sdk-dlp-alc-lightcrafter-sdk/3084671?tisearch=e2e-sitesearch&keymatch=VS%20DLP#3084671
- qq_41507735,解决:检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2””。
https://blog.csdn.net/qq_41507735/article/details/126059788
- 文件下载链接
文件目录
├── FlyCapture2.12.3.31缺失文件
│ ├── FlyCapture2.dll
│ ├── FlyCapture2_C.dll
├── OpenCV3.1.0缺失文件
│ ├── libopencv_calib3d310.dll
│ ├── libopencv_features2d310.dll
│ ├── libopencv_imgproc310.dll
│ ├── libopencv_core310.dll
│ ├── libopencv_highgui310.dll
│ ├── libopencv_flann310.dll
│ ├── files for opencv3.1.0 cmake.zip
链接: https://pan.baidu.com/s/1APpMPrqU_5_ZYuLavD2dSQ?pwd=1895 提取码: 1895