前言:
本人一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,否则找不到文件,链接失败
此界面中,上方的Configuration,选择Release即可配置Release版的Opencv,Release版的编译完了不带d,都是形如 libxxx.dll.a的,Debug版的是 libxxxd.dll.a
------------------------------------------------------------------------------------------然后就可以正常调试程序了-----------------------------------------------------------------------------------------------
后话:
另外有些疑问,网上的教程大多都提到了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>
所有配置的静态库文件项都被 listOperationValue节点包围着,小弟用Java写个工具类输出这些 listOperation:复制过去就行了。
如果新建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));
}
}
}