OpenCV(Open Source Computer Vision Library)是BSD协议下的开源代码库。OpenCV提供了一系列高性能的图像处理函数。目前(2015.01.27)最新版本是2.4.10。1.x版本使用C的API,2.x版本同时提供C++的API。全新的3.0.0版本已经到了Beta阶段,相对2.x会有很大变化。C++版本的数据结构和函数的性能比C版本的要好很多,如果是在嵌入式平台使用OpenCV,只能用C版本;否则,最好使用C++来写。
我的配置情况:
Windows 7 旗舰版 x64
Visual Studio 2010 旗舰版
.NET Framework 4.5
OpenCV 2.4.7
1.下载并解压OpenCV
从官网可以下载最新版,或者在这里直接下载2.4.10版本。下载到的文件名为“opencv-2.4.10.exe”,是个自解压文件,大小350MB左右。
下载好之后,解压到任意一个文件夹,比如“E:\softwares”。没有必要手动创建一个专门的文件夹,因为文件在解压时会自动创建一个叫opencv的文件夹,并把所有文件都解压到这个文件夹内。
2.设置环境变量
OpenCV库函数需要通过用户环境变量调用所需要的库文件。点击:开始->计算机(右击)->属性->高级系统设置->高级->环境变量,在用户变量里增加一项:
变量名:path
变量值:E:\softwares\opencv\build\x86\vc10\bin
如果已经有path项,在其变量值结尾添加英文分号“;”,再加上上面那个值。
这里的“x86”代表目标程序是32位的,如果要写64位的程序则选择“x64”文件夹。并不是根据开发环境(你的机器)选择的。
后面的“vc10”代表使用Visual C++ 2010开发。如果使用Visual Studio 2012,则填写“E:\softwares\opencv\build\x86\vc11\bin”。
注销用户,重新登录Windows,保证环境变量更新并起作用。
3.创建并配置工程
打开Visual Studio 2010,新建一个工程,选择Visual C++ ->Win32->Win32 Console Application,命名例如“OpencvTest”,
点击“Next”,
选择Console application和Empty project。如果不勾选“Empty project”并勾选“Precompiled header”,在代码第一行前面还要加上一行:
#include "stdafx.h"
避免出现fatal error C1010错误。然后点击“Finish”。
在Solution Explorer中右击工程名,选择Properties。
在弹出的窗口“OpencvTest Property Pages”中,Configuration选择“Debug”(或者默认的“Active(Debug)”),Platform选择“Win32”。在左边选择Configuration Properties->VC++ Directories,在右边的General中编辑Include Directories,增加以下三项:
E:\softwares\opencv\build\include
E:\softwares\opencv\build\include\opencv
E:\softwares\opencv\build\include\opencv2
其实只需要填入第一行即可。由于“include\opencv”包含C版本的头文件,“include\opencv2”包含C++版本的头文件。所以编写代码时,在头文件名称前加上“opencv/”或“opencv2/”来区分两种版本。
在Library Directories中增加以下一项:
E:\softwares\opencv\build\x86\vc10\lib
把Configuration改为“Release”,然后对Include Directories和Library Directories做同样的修改。如果只写练习程序,只用debug功能,那么“Release”可以不用修改。如果使用Visual Studio 2012,则填写“E:\softwares\opencv\build\x86\vc11\lib”。
仍然在“OpencvTest Property Pages”窗口下,Configuration选择“Debug”。在左边选择Configuration Properites->Linker->Input,在右面编辑Additional Dependencies,增加以下若干项(可以根据自己的需要适当删减,关于各个模块的功能,请参考这里):
opencv_calib3d2410d.lib
opencv_contrib2410d.lib
opencv_core2410d.lib
opencv_features2d2410d.lib
opencv_flann2410d.lib
opencv_gpu2410d.lib
opencv_highgui2410d.lib
opencv_imgproc2410d.lib
opencv_legacy2410d.lib
opencv_ml2410d.lib
opencv_objdetect2410d.lib
opencv_ts2410d.lib
opencv_video2410d.lib
(同样,如果仅使用debug模式,这一步可以跳过)把Configuration改为“Release”,在Additional Dependencies增加以下若干项(在文件名上的区别仅在于在末尾少了一个“d”):
opencv_calib3d2410.lib
opencv_contrib2410.lib
opencv_core2410.lib
opencv_features2d2410.lib
opencv_flann2410.lib
opencv_gpu2410.lib
opencv_highgui2410.lib
opencv_imgproc2410.lib
opencv_legacy2410.lib
opencv_ml2410.lib
opencv_objdetect2410.lib
opencv_ts2410.lib
opencv_video2410.lib
虽然OpenCV版本众多,但文件结构都很类似。如果想使用其他版本,如2.4.7而不是2.4.10,只需要修改上面一系列*.lib文件名中的版本号即可,比如把“opencv_calib3d2410.lib”改为“opencv_calib3d247.lib”。在Notepadd++等文本编辑器中,有一个快速修改的方法,就是使用Notepadd++等文本编辑器的替换功能,以“247”替换“2410”。
4.例程测试
假设在“H:\”盘有个名为“bee.jpg”的图片,下面用一段程序实现把这个图片逐渐变成灰度图像的过程。
删掉OpencvTest.cpp内的内容,把下面的代码复制进去:
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char **argv) { const char* filename = "H:\\bee.jpg"; Mat srcImg = imread(filename, CV_LOAD_IMAGE_COLOR); if(srcImg.empty()) return -1; //imshow("source", srcImg); double timeSpent = (double)getTickCount(); //----------------------------------- Mat tmp1Img(srcImg.size(),CV_8UC1); Mat tmp3Img(srcImg.size(),CV_8UC3); cvtColor(srcImg,tmp1Img,CV_RGB2GRAY); cvtColor(tmp1Img,tmp3Img,CV_GRAY2RGB); Mat dstImg(srcImg.size(), CV_8UC3); double blender; for(int i=0; i<100; i++) { blender = (double)i/100.0; addWeighted(srcImg,1-blender,tmp3Img,blender,0,dstImg); imshow("result",dstImg); waitKey(30); } //------------------------------------ timeSpent = ((double)getTickCount() - timeSpent)/getTickFrequency(); cout << "Time spent in milliseconds: " << timeSpent*1000 << endl; waitKey(0); return 0; }
这段程序先读入bee.jpg图片,再创建一个同样大小的灰度版本的图片,然后在一个循环中把两张图片按逐渐变化的比例融合,产生从彩色到灰度变化的动态效果。
点击按钮“Start Debugging”或按F5键,程序就会运行了。运行效果如下:
然后按键盘上任意一键,程序就会结束。
5.常见错误处理
1.如果提示缺少tbb_debug.dll,需要下载一个tbb41_20130314oss_win.rar文件。将其解压后的bin文件夹里的所有文件复制到:
E:\softwares\opencv\build\common\tbb
然后在用户环境变量path里添加:
E:\softwares\opencv\build\common\tbb\ia32\vc10
2.如果提示“LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt”,在Project Properity中找到Configuration Properties->Linker->General,把右面Enable Incremental Linking改为“No(/INCREMENTAL:NO)”。这一项在Debug模式下默认为Yes,在Release模式下默认为True。
2015.01.27更新:
更新到OpenCV 2.4.10版本。#opencv2410
并加入Visual Studio 2012配置方法。#vc11_bin #vc11_lib
2015.05.15更新:
加入新建项目勾选“Empty project”的说明。#stdafx.h
1>LINK : fatal error LNK1104: 无法打开文件“D:\1\16opencv\16opencv2\opencv\build\x86\vc10\bin.obj”
请问这是什么原因呢?
(求大佬指点,已经鼓捣了两天了啊啊啊啊)
重装vs2010就好了////
请接受我的膝盖,太感谢您啦
博主,你好!我按照你的方法配置opencv2.4.7 vs2010时出现:
1>—— 已启动生成: 项目: OpencvTest, 配置: Debug Win32 ——
1>生成启动时间为 2016/11/8 13:29:25。
1>InitializeBuildStatus:
1> 正在对“Debug\OpencvTest.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1> 所有输出均为最新。
1> OpencvTest.cpp
1>c:\users\administrator\documents\visual studio 2010\projects\opencvtest\opencvtest\opencvtest.cpp(1): error C2001: 常量中有换行符
1>
1>生成失败。
1>
1>已用时间 00:00:00.96
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
还有执行时出现这个问题:无法启动程序"visual studio 2010\projects\Opentest\Debug\OpencvTest.exe" 系统找不到指定的文件。
求博主解答!谢谢
是不是代码中不小心打了中文字符、标点符号什么的呢?
请问一下你是如何解决的,我的也是这个错误
你的文件路径filename中文件夹之间是单斜线还是双斜线?如果字符串里面含有\n,\t之类的会被编译器理解为换行,制表符等转义字符,都要改成双斜线
1>—— 已启动生成: 项目: OpencvTest, 配置: Debug Win32 ——
1>生成启动时间为 2016/11/5 14:06:51。
1>InitializeBuildStatus:
1> 正在对“Debug\OpencvTest.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1> 所有输出均为最新。
1> 所有输出均为最新。
1>ManifestResourceCompile:
1> 所有输出均为最新。
1>LINK : fatal error LNK1104: 无法打开文件“opencv_calib3d248d.lib”
1>
1>生成失败。
1>
1>已用时间 00:00:00.37
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
请问这个怎么弄?
博主,我知道哪里错了,但是出现了新的问题,运行没有错误,但是结果出不来,说应用程序无法正常启动,
“OpencvTest.exe”: 已加载“D:\vs2010\OpencvTest\Debug\OpencvTest.exe”,已加载符号。
“OpencvTest.exe”: 已加载“C:\Windows\SysWOW64\ntdll.dll”,Cannot find or open the PDB file
“OpencvTest.exe”: 已加载“C:\Windows\SysWOW64\kernel32.dll”,Cannot find or open the PDB file
“OpencvTest.exe”: 已加载“C:\Windows\SysWOW64\KernelBase.dll”,Cannot find or open the PDB file
“OpencvTest.exe”: 已加载“C:\Windows\SysWOW64\msvcp100d.dll”,已加载符号。
线程 'Win32 线程' (0x12c4) 已退出,返回值为 -1073741701 (0xc000007b)。
线程 'Win32 线程' (0x2de4) 已退出,返回值为 -1073741701 (0xc000007b)。
线程 'Win32 线程' (0x2f70) 已退出,返回值为 -1073741701 (0xc000007b)。
程序“[3716] OpencvTest.exe: 本机”已退出,返回值为 -1073741701 (0xc000007b)。
程序出错时控制台(小黑框窗口)输出的信息是什么呢?
我遇到的这个情况是格式化输入错误,scanf读取数据类型与定义类型不一致,不知道你的是不是。
楼主:E:\softwares\opencv\build\x86\vc10\lib
我没有找到啊,我的那里面就这两个:
1、D:\Program Files\opencv\build\x86\vc11\lib
2、D:\Program Files\opencv\build\x86\vc12\lib
这是为什么?
我用这个D:\Program Files\opencv\build\x86\vc11\lib配置。
运行测试程序,最后程序运行显示的是:系统找不到指定文件
请问楼主这是那么问题?
怎么解决?
谢谢!
这是因为你下载的OpenCV预编译库不支持vs2010,可以参考我的另一篇文章http://johnhany.net/2015/10/windows7-compile-opencv3-with-cuda/试着自己编译一下需要的版本。
你好,我想请问一下,这是什么原因呢,该如何解决??谢谢
1>d:\program files (x86)\opencv\build\include\opencv2\core\mat.hpp(1965): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\program files (x86)\opencv\build\include\opencv2\core\persistence.hpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\program files (x86)\opencv\build\include\opencv2\core\mat.hpp(1965): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\program files (x86)\opencv\build\include\opencv2\core\utility.hpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>d:\program files (x86)\opencv\build\include\opencv2\core\utility.hpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>LINK : fatal error LNK1104: 无法打开文件“opencv_calib3d310d.lib”
对了,我的是opencv3.1,为什么那个文件不能打开呢
应该是Library Directories没有配置正确或者Linker->Input中的.lib文件名称填写不正确导致的
1>test5.obj : error LNK2019: 无法解析的外部符号 "class cv::Mat __cdecl cv::imread(class cv::String const &,int)" (?imread@cv@@YA?AVMat@1@ABVString@1@H@Z),该符号在函数 _main 中被引用
1>test5.obj : error LNK2019: 无法解析的外部符号 "private: char * __thiscall cv::String::allocate(unsigned int)" (?allocate@String@cv@@AAEPADI@Z),该符号在函数 "public: __thiscall cv::String::String(char const *)" (??0String@cv@@QAE@PBD@Z) 中被引用
1>test5.obj : error LNK2019: 无法解析的外部符号 "private: void __thiscall cv::String::deallocate(void)" (?deallocate@String@cv@@AAEXXZ),该符号在函数 "public: __thiscall cv::String::~String(void)" (??1String@cv@@QAE@XZ) 中被引用
1>test5.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::error(int,class cv::String const &,char const *,char const *,int)" (?error@cv@@YAXHABVString@1@PBD1H@Z),该符号在函数 "public: class cv::Size_<int> __thiscall cv::MatSize::operator()(void)const " (??RMatSize@cv@@QBE?AV?$Size_@H@1@XZ) 中被引用
1>E:\TEST\test5\Debug\test5.exe : fatal error LNK1120: 5 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
“无法解析的外部符号”一般代表链接库出现了问题,检查一下.lib文件的路径和文件名是否正确:)
谢谢,应该是这些问题,昨天莫名其妙的解决了
按照楼主的方法配置,然后运行那个程序,为什么会出现(无法启动程序。。。exe,系统找不到指定的文件)的提示,希望楼主帮帮我
#include "stdafx.h"
#include <highgui.h>
在代码最前面再写以上两行代码
如果新建项目时选择的是Empty project,就不需要包含stdafx.h。
highgui.h是属于opencv的include\opencv下的一个头文件,如果在项目属性的Include Directories中添加了\build\include\opencv,那么#include 与#include 的作用是相同的。另外要注意opencv\highgui.h是针对C接口的,而opencv2\highgui.hpp是针对C++接口的。
程序最前面应该再写两行代码,如下:
#include "stdafx.h"
#include <highgui.h>
“opencvtest.exe”: 已加载“C:\Users\lenovo\Documents\Visual Studio 2010\Projects\opencvtest\Debug\opencvtest.exe”,已加载符号。
“opencvtest.exe”: 已加载“C:\Windows\SysWOW64\ntdll.dll”,Cannot find or open the PDB file
“opencvtest.exe”: 已加载“C:\Windows\SysWOW64\kernel32.dll”,Cannot find or open the PDB file
“opencvtest.exe”: 已加载“C:\Windows\SysWOW64\KernelBase.dll”,Cannot find or open the PDB file
调试器:: 在进程加载过程中引发了未处理的无法继续的异常
程序“[6780] opencvtest.exe: 本机”已退出,返回值为 -1073741701 (0xc000007b)。
请教一下大神,这是为什么呢?应该如何解决?谢谢啦 1>—— Rebuild All started: Project: OpencvTest, Configuration… 阅读更多 »
为什么创建完工程就有那些cpp文件了,按照那个步骤源文件,头文件,资源文件会自己加进去吗
我的错误是fatal error C1083: 无法打开包括文件:“opencv2/core/core.hpp”: No such file or directory
请问,我输入你图片中的代码,为什么#include这些标识错误?
请问,配置完了以后要看什么书?关于opencv2.4.10的?
如果是侧重2.4版本的,推荐阅读布拉德斯基的《学习OpenCV》;如果想尝试3.0以上版本,可以读一下毛星云的《OpenCV3编程入门》,我们团队的新同学都在看这本。
你好,请问这个opencv2.4.10要看什么书啊?
1>—— 已启动生成: 项目: OpencvTest, 配置: Debug Win32 ——
1>生成启动时间为 2016/6/12 星期日 11:56:26。
1>ClCompile:
1> OpencvTest.cpp
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(11): warning C4129: “A”: 不可识别的字符转义序列
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(11): warning C4129: “D”: 不可识别的字符转义序列
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(11): warning C4129: “O”: 不可识别的字符转义序列
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(11): warning C4129: “O”: 不可识别的字符转义序列
1>
1>生成成功。
1>
1>已用时间 00:00:01.86
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
求大神解决啊,没有上面结果 是什么原因呢?
抱歉回复的比较晚,应该是文件路径字符串中反斜线的问题吧,把单斜线改成双斜线就好了
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(8): warning C4129: “A”: 不可识别的字符转义序列
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(8): warning C4129: “D”: 不可识别的字符转义序列
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(8): warning C4129: “O”: 不可识别的字符转义序列
1>c:\users\administrator\desktop\vs\opencvtest\opencvtest\opencvtest.cpp(8): warning C4129: “O”: 不可识别的字符转义序列
编译出现这个 是什么意思???
按照楼主的方案配置了,把案例代码复制进去编译,结果:
fatal error C1083: 无法打开包括文件:“opencv2/core/core.hpp”: No such file or directory
1>
是include directories没设置好,再检查一下吧
你好 我运行别人的程序exe时出现了缺少opencv_244d.dll 无法运行的问题 按照你说的方法配置了opencv 可还是不行 求解 谢谢
2.4.4版本比较老,我没用过,在官网也没找到相应的下载地址,所以不能确定opencv_244d.dll是来自opencv库的,还是需要自己编译产生的。如果你有2.4.4版本的库,请看一下在build\bin目录里有没有这样一个文件。
好的 3q