vs2015 mfc开发的opencv程序在有的电脑上打开视频文件失败

下载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的,在读取文件初始化时,会加载单独的一个类,这个类中加载这个库

猜你喜欢

转载自blog.csdn.net/jszj/article/details/79753798