前言:
本人一Java程序员,对C/C++相当新手,最近读了《学习Opencv中文版》这本书,下载了目前最新版本3.4.2的代码,想尝尝鲜,先后遇到一些问题都一一解决了,将成功的过程写下,以备以后查阅,如果能帮助到别人俺就更欣慰了。好了,言归正传。(PS: 这是俺的处女博客哦)
正文:
第一步:下载Opencv(Ecipse和CDT插件、Mingw、cmake 神马的都下载好了)
我是从SourceForge下载的:http://SourceForge.net/projects/opencvlibrary
第二步: 编译Opencv
Cmake编译,默认CMAKE_BUILD_TYPE是空的,空的也会当成Release版,手动输入Debug才能生成Debug版的。
我们希望生成Debug和Release两个版本的,注意修改配置之后要重新点击下方的Configure按钮
下面使用 Mingw32 真正编译,切换目录到E:/build/opencv-mingw-debug,命令行输入:mingw32-make 回车即可开始编译,一般的机器需要30分钟的编译时间。
完成之后,可以在build的目录下找到bin和lib,里面的东西(.dll、.a)正是我们所需要的。
同样,修改CMALE_BUILD_TYPE为Release即可生成Release版的opencv。
第三步,Eclipse新建C++项目,并调试
新建项目cv1-showimg,选中,单击右键,alt+Enter进入Propertise配置,C/C++ Build -> Settings
这里是配置Include文件的path,我是懒得弄了,把源码(我的解压目录是E:\opencv)下include文件夹下,opencv和opencv2俩文件夹都复制到C:/mingw/include下了
源码里面这样引用:
#include "opencv/cv.h" #include "opencv/highgui.h" int main(int argc,char** argv){ IplImage* img = cvLoadImage(argv[1]); const char*name = "Example1-showimg"; cvNamedWindow(name,CV_WINDOW_AUTOSIZE); cvShowImage(name, img); cvWaitKey(0); cvReleaseImage( &img ); cvDestroyWindow(name); return 0; }下面配置Debug库,严重注意: 编译完的lib目录下,所有的.a文件都是 libxxxx.dll.a,而在Eclipse的配置中千万不能带lib,否则找不到文件,链接失败
------------------------------------------------------------------------------------------然后就可以正常调试程序了-----------------------------------------------------------------------------------------------
后话:
另外有些疑问,网上的教程大多都提到了opencv的"安装",我也安装了试试,mingw32-make install,结果就是显示了安装过程,但是不知道安装到哪儿了,C盘也没多出文件来,对Opencv的开发好像没啥用。
Tips: 一个个手动添加配置太麻烦?俺有一招:打开eclipse下新建的C/C++项目,找到.cproject文件,是xml格式,当你添加一个文件之后就可以发现了新大陆了
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.mingw.exe.debug.994930724" name="Debug" parent="cdt.managedbuild.config.gnu.mingw.exe.debug"> <folderInfo id="cdt.managedbuild.config.gnu.mingw.exe.debug.994930724." name="/" resourcePath=""> <toolChain id="cdt.managedbuild.toolchain.gnu.mingw.exe.debug.714211734" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.exe.debug"> <targetPlatform id="cdt.managedbuild.target.gnu.platform.mingw.exe.debug.1696639208" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.mingw.exe.debug"/> <builder buildPath="${workspace_loc:/cv1-showImg/Debug}" id="cdt.managedbuild.tool.gnu.builder.mingw.base.1231719534" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="CDT Internal Builder" superClass="cdt.managedbuild.tool.gnu.builder.mingw.base"/> <tool id="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug.661410203" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.exe.debug"> <inputType id="cdt.managedbuild.tool.gnu.assembler.input.1812861609" superClass="cdt.managedbuild.tool.gnu.assembler.input"/> </tool> <tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.553955256" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/> <tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug.362612869" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.exe.debug"> <option id="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level.756672965" name="Optimization Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/> <option id="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level.1282867055" name="Debug Level" superClass="gnu.cpp.compiler.mingw.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/> <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.624068736" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/> </tool> <tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug.1235383212" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.exe.debug"> <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.mingw.exe.debug.option.optimization.level.1929368360" name="Optimization Level" superClass="gnu.c.compiler.mingw.exe.debug.option.optimization.level" valueType="enumerated"/> <option id="gnu.c.compiler.mingw.exe.debug.option.debugging.level.220009775" name="Debug Level" superClass="gnu.c.compiler.mingw.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.959937369" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/> </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug.302517821" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.exe.debug"/> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug.1880397147" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.exe.debug"> <option id="gnu.cpp.link.option.libs.305406841" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs"> <listOptionValue builtIn="false" value="opencv_core246d.dll"/> <listOptionValue builtIn="false" value="opencv_imgproc246d.dll"/> <listOptionValue builtIn="false" value="opencv_highgui246d.dll"/> <listOptionValue builtIn="false" value="opencv_ml246d.dll"/> <listOptionValue builtIn="false" value="opencv_video246d.dll"/> <listOptionValue builtIn="false" value="opencv_features2d246d.dll"/> <listOptionValue builtIn="false" value="opencv_calib3d246d.dll"/> <listOptionValue builtIn="false" value="opencv_objdetect246d.dll"/> <listOptionValue builtIn="false" value="opencv_contrib246d.dll"/> <listOptionValue builtIn="false" value="opencv_legacy246d.dll"/> </option> <option id="gnu.cpp.link.option.paths.1414659043" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths"> <listOptionValue builtIn="false" value=""D:\Shared\opencv\debug\lib""/> </option> <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.891296017" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input"> <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> <additionalInput kind="additionalinput" paths="$(LIBS)"/> </inputType> </tool> </toolChain> </folderInfo> <sourceEntries> <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/> </sourceEntries> </configuration> </storageModule>
如果新建C/C++项目的话,直接复制.cproject这个文件就ok了,省的一个个点击按钮弹出输入框、输入、点ok,主要的opencv库文件有19个,一个个弄,有点慢吧。
import java.io.File; import java.io.FileFilter; /** * */ /** * 输入:编译完的静态库(.a)文件路径 * 输出:Eclipse C/C++项目配置文件下的 listOperation xml节点配置 * * @author Administrator * */ public class PrintLibXmlCfgOps { /** * @param args */ public static void main(String[] args) { if (args.length < 1) { System.err.println("缺少文件名"); return; } String filePath = args[0]; File dir = new File(filePath); File[] flist = dir.listFiles(new FileFilter() { @Override public boolean accept(File f) { return f.isFile(); } }); final String fmt="<listOptionValue builtIn=\"false\" value=\"%s\"/>"; System.out.printf("共有个 %d 文件\n\n",flist.length); for (File f : flist) { String name = f.getName(); // 去掉 lib 前缀 if (name.startsWith("lib")) { name = name.substring(3); } // 去掉后缀 int dot = name.lastIndexOf('.'); if(dot > -1) name = name.substring(0, dot); System.out.println(String.format(fmt, name)); } } }