现在的位置: 首页 > 综合 > 正文

opencv eclipse cmake mingw 编译 配置

2013年03月02日 ⁄ 综合 ⁄ 共 7369字 ⁄ 字号 评论关闭

前言:

本人一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));
		}
	}

}


抱歉!评论已关闭.