下载opencv3.3.0版本后自己用vs2015编译,很是成功,生成了一堆的dll,当然还有其它的一堆文件,包括大量的exe程序,在此只说dll文件
自己用vs2015 mfc 写了个工具,调用自己编译的opencv库简单地播放视频,所谓简单,即是以固定帧率进行的播放,而没有考虑实际的帧率。
在我的电脑上播放正常,然后拷贝到另外的电脑上,试了三台电脑都是失败,通过跟踪发现是打开文件失败。
// 类中声明 cv::VideoCapture m_cvCapture;
// m_stVideo 为一个CStatic控件
// 以下为打开文件的函数
bool CDlgShowVideo::OpenPlayer(CString strFileName)
{
USES_CONVERSION;
strFileName.Replace(TEXT("/"), TEXT("\\"));
char *fn = W2A(strFileName);
m_cvCapture = cv::VideoCapture(fn);
if (!m_cvCapture.isOpened())
{
m_stVideo.SetWindowText(TEXT("打开文件失败.\n"));
return false;
}
m_stVideo.SetWindowText(TEXT(""));
OutputDebugString(TEXT("打开文件成功.\n"));
return true;
}
如果打开文件失败,就在显示视频的控件上显示”打开文件失败“,否则设置其文本为空。
在我的电脑上运行正常,在另外三台电脑上都显示为 ”打开文件失败“
这有点奇怪,用depends查看,文件一个也不少,操作系统也都是win7 64bit,所以还是怀疑相关的文件不足导致的。
由于opencv库都很大,所以为了减少程序尺寸,决定拷贝最少数量的opencv文件,我用depends查看自己的程序依赖项,发现只依赖了5个opencv的dll文件:
opencv_core330.dll、opencv_highgui330.dll、opencv_imgcodecs330.dll、opencv_imgproc330.dll、opencv_videoio330.dll
所以就只把这5个拷贝到程序的目录里,然后把这个目录拷贝到其他电脑上。
现在为了查看究竟缺少的是哪个库,在工具播放视频文件的过程中,我去删除opencv编译目录下的文件,发现只有一个文件删除不掉:opencv_ffmpeg330.dll,这次为了保险(也为了方便以后加一些功能时不用再查找需要哪一个库),也一并拷贝了另外的几个文件:
opencv_shape330.dll、opencv_video330.dll、opencv_videostab330.dll
这次把这4个文件同时拷贝过去后,可以正常打开文件和播放了。
这样看,除了开始的5个文件之外,其它的都是动态加载的,但是我在opencv工程里没有搜索到LoadLibrary()函数,还不太清楚是如何加载的这些库
2018.7.25更新:
后来跟踪发现,还是有LoadLibrary()函数来加载opencv_ffmpeg330.dll的,在读取文件初始化时,会加载单独的一个类,这个类中加载这个库