opencv库函数是如何被系统调用 库函数的,怎样修改

1413人阅读
OpenCV基础学习系列(29)
&&&&&&& 我们在做项目时,通常需要把依赖于opencv,vs(例如vs2005),或者vc(例如vc6.0)的程序,在没有安装相关环境的电脑上去运行。那么现在有哪些方法可以摆脱这些依赖?
&&&&&&& 在没有安装OpenCV的电脑上,要运行基于OpenCV库的程序,有两种方法:一、动态链接:就是将OpenCv安装目录下的bin目录下的*.dll文件与应用程序一起打包发布;二、静态链接:就是将OpenCV库源代码先用cMake进行编译,然后将opencv库的源文件加到工程中一期编译,也就是说最后生成的可执行文件可以单独运行,不需要OpenCV的动态链接库。具体方法大家可以参考
&&&&&&上面博客内容的转载:
&&&&& 首先要明确在没有安装OpenCV的电脑上,要运行基于OpenCV库的程序,有两种方法:
&&&&& 一、将OpenCv安装目录下的bin目录下的*.dll文件 与应用程序一起打包发布。
&&&&& 二、将OpenCV库源代码加载到工程中和应用程序一起编译,也就是说最后生成的可执行文件可以单独运行,不需要OpenCV的动态链接库。下面将详细介 绍这种方法。
&&&&&&& 首先要确定程序使用了OpenCV的哪些库函数,一般来说,cv、cxcore和highgui是必需的,为简化说明,下面将只编译这三个库,如果有使用 其它库,同样也要加入。系统环境为:WindowsXP+VC6.0+OpenCV1.0。
1、&&为方便管理,先将OpenCv安装目录下的cv、cxcore、otherlibs/highgui三个目录复制到你的工程目录。
2、&&在集成开发环境的项目管理窗口中(FileView)新建两个文件夹,分别为opencv_src,opencv_include。
3、&&在项目管理窗口中右击opencv_include项,选择Add Files to Folder...,将第1步中已复制至工程目录下的三个目录下的include目录中的.h文件添加到该项目管理文件夹中。接着按相同做法将三个目录下 的src目录中的.cpp文件添加到opencv_src项目管理文件夹中。
4、&&几点注意:dummy.cpp在三个目录下都有,只需要添加一次。Highgui目录下以cvcap开头的.cpp文件为摄像头相应库,如果你的程序没有 处理视频,不要添加这些.cpp文件。不要添加window_carbon.cpp文件,原因还不明。
5、&&右击opencv_src,选择Setting...,选择C/C++页,在Category选择Precompiled Headers,再选择下面四个单选项中的第一项”Not using precompiled headers”。这样做的目的是不使用编译头文件,否则会产生“找不到文件结尾”的错误。也可以在每个.cpp文件的开头加入include
”stdafx.h”,但显然没有更改一个选项来得方便。
6、&&在Project-&Settings...-&C/C++中,选择Category中的Preprocessor项,把 Additional include directories改为cv/include,cv/src,highgui, cxcore /include,
cxcore /src
7、&&Project-&Settings...-&Link,如果Object/library modules中有cv.lib,cvaux.lib,highgui.lib,删除之。
再补充(小魏的修行路csdn):
&&&&&&& 我们下载的OpenCV安装包一般包括源码,示例,文档和编译好的动态链接库(以前OpenCV可能需要自己编译一遍,OpenCV2.3.1之后都有一个build的文件夹,有编译好的mingw,vc9和vc10的版本)。
&&&&&&& 我们写代码如果调用OpenCV的函数,需要添加附加依赖项:
&&&&&&& Include Directories :C:\OpenCV\OpenCV-2.4.2\build\include
&&&&&&& Library Diractories:C:\OpenCV\OpenCV-2.4.2\build\x86\vc10\lib
然后还需要在Linker-&Input-&Additional Dependencies里添加会用到的各种XX.lib,XXd.lib
还有把两个bin文件夹:
&&&&&& C:\OpenCV\OpenCV-2.4.2\build\x86\vc10\bin
&&&&&& C:\OpenCV\OpenCV-2.4.2\build\common\tbb\ia32\vc10
添加到系统环境目录
&&&& 有的安装教程里还会教我们在Source Directories添加OpenCV的源码文件,其实是不需要的。因为实际调用OpenCV里的函数是用的dll的隐式调用方式。
隐式调用一般需要:
&&&& 声明函数接口的.h文件——include文件夹里的内容
&&&& 链接动态库的.lib文件——lib文件夹里的内容以及Input-&Additional Dependencies添加的XX.lib
&&&& 动态链接库.dll文件——bin文件夹的内容
&&&&& 这里bin文件夹是在系统环境目录里的,所以执行代码是exe文件可以找到。也可以添加在系统文件中,把需要用到的dll拷贝到exe同一个文件夹下即可。
所以,如果把未发布的工程拷贝到没有opencv的电脑上,只要把需要用的函数相关的.h,.lib以及.dll文件考过去即可。
另一种调用dll的方式是显示调用。
&&&&&&& 显示调用是不需要.lib和.h文件的。是在代码里“显示”加载要用到的函数。例如:
&&&&&&& HINSTANCE& hDLL=NULL;//生命DLL句柄&&
&&&&&& &hDLL=LoadLibrary(&opencv_core242d.dll&);&&//加载DLL
&&&&&&& HMAT &myImread=(HMAT)GetProcAddress(hDLL,&imread&);&&//使用DLL中的函数
&&&&&& 这样在拷贝工程时只拷贝用到的DLL文件就可以。但这样代码写得很麻烦,DLL换个名字版本之类的要改很多地方,一般用得不多。
如果只是给别人静态链接的exe程序(比如一个demo,不用跑程序),那只要给别人dll文件就可以。也就是将需要用到的dll文件拷到exe文件夹下即可,Release拷贝XX.dll,Debug版本拷贝XXd.dll(所以我们写Additional Dependencies不用到的尽量不写,这样拷的dll会少一些~)
再一种方法就是楼上提到的把OpenCV的源码一起编译到可执行文件中。这样就不用拷贝dll文件,只是生成的exe会比较大~
&&&&&&&& &&&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:153306次
积分:1900
积分:1900
排名:第18294名
原创:14篇
转载:109篇
评论:13条
(8)(16)(18)(3)(30)(49)本帖子已过去太久远了,不再提供回复功能。opencv(5)
对于刚接触opencv的新手来说,利用opencv库函数来实现了某些功能兴奋之余,对其库函数的具体实现更是好奇。仔细读懂opencv的库函数也对函数的用法和限制有了更深入的理解。
& & 但在VS2010中,在opencv的函数上单击右键后,无论是点“转到定义”或“转到申明”结果都一样,只能跳转到函数对应的头文件中。
& & & & & &方法一:在opencv的安装文件夹中找到 与头文件名字对应的.C 或 .CPP 文件,然后在对函数进行查找。但不是所用函数都是这样的。例如cvSmooth函数,单击“转到定义”后,其跳转到imgproc_c.h中。通过找到imgproc.c或者imgproc.cpp都没有找到&cvSmooth函数。
& & & & & & 方法二:在VS2010的“编辑”菜单下,点“查找与替换”,然后选“在文件中查找”。对于opencv的源代码,都放在 &(安装目录).../opencv/modules 这个文件夹中。将此文件夹添加到查找目录点击查找即可在查找结果中找到函数的实现。
相比之下,方法二更加的简单,有效。
存在一个问题:调试代码时按F11无法进入OpenCV内部源码(比如cvLoadImage函数的实现)进行调试。把modules目录加入Source Directories无法解决问题,其实根本原因是运行时调用了OpenCV自带的dll文件(如opencv_core231d.dll等),要想进入OpenCV内部源码进行调试,必须用相应的编译器(比如VC2010)手动编译opencv源码,然后运行时调用编译出来的dll文件即可(在环境变量里时设置)。编译opencv源码请使用CMake,这个工具会生成所选择的编译器的项目文件,支持
Visual Studio 6/7/8/9/10/11以及Eclipse,CodeBlocks,Borland等编译器)。
Reference:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:43065次
排名:千里之外
原创:33篇
转载:46篇
(1)(5)(4)(20)(17)(10)(1)(7)(5)(2)(4)(1)(1)(1)(1)查看: 4786|回复: 6
opencv库函数是如何被调用的,怎样修改
程序中调试跟踪运行过程,在库函数中设置断点却不起作用,所以想请问,opencv库函数是如何被调用的,怎样修改呢?
opencv库函数是如何被调用的,怎样修改
程序中调试跟踪运行过程,在库函数中设置断点却不起作用,所以想请问,opencv库函数是如何被调用的,怎样修改呢?opencv怎么样被调用的,找个要看看C++的一些基础知识了,至于修改opencv的源代码,可以在opencv的工程里面修改,修改了之后重新编译就可以了。
opencv库函数是如何被调用的,怎样修改
那个是lib,你打断点更不进去的,除非你把source code加入工程
opencv库函数是如何被调用的,怎样修改
[quote=&iceman332&:yg0abhp5]程序中调试跟踪运行过程,在库函数中设置断点却不起作用,所以想请问,opencv库函数是如何被调用的,怎样修改呢?opencv怎么样被调用的,找个要看看C++的一些基础知识了,至于修改opencv的源代码,可以在opencv的工程里面修改,修改了之后重新编译就可以了。[/quote:yg0abhp5]
如果我想修改cvbgfg_gaussmix.cpp中的函数实现,具体应该怎么做呢?
opencv库函数是如何被调用的,怎样修改
如果我想修改cvbgfg_gaussmix.cpp中的函数实现,具体应该怎么做呢?前提:你已经学会了如何编译opencv的库。(如果不会,先需要学会,先Google检索论坛吧)
步骤:修改完对应的代码,然后重新编译opencv库。
opencv库函数是如何被调用的,怎样修改
[quote=&iceman332&:2mrfywet]
如果我想修改cvbgfg_gaussmix.cpp中的函数实现,具体应该怎么做呢?前提:你已经学会了如何编译opencv的库。(如果不会,先需要学会,先Google检索论坛吧)
步骤:修改完对应的代码,然后重新编译opencv库。[/quote:2mrfywet]
Thanks,我好像有点明白了!EXE文件执行的时候,调用的是opencv安装目录下的dll动态链接库,所以要想修改响应函数,要重新编译成静态库文件或动态库文件,然后放在程序目录下,不知道我理解的对不对。
opencv库函数是如何被调用的,怎样修改
[quote=&ollydbg23&:2g45ot5h][quote=&iceman332&:2g45ot5h]
如果我想修改cvbgfg_gaussmix.cpp中的函数实现,具体应该怎么做呢?前提:你已经学会了如何编译opencv的库。(如果不会,先需要学会,先Google检索论坛吧)
步骤:修改完对应的代码,然后重新编译opencv库。[/quote:2g45ot5h]
Thanks,我好像有点明白了!EXE文件执行的时候,调用的是opencv安装目录下的dll动态链接库,所以要想修改响应函数,要重新编译成静态库文件或动态库文件,然后放在程序目录下,不知道我理解的对不对。[/quote:2g45ot5h]
楼主,我觉得opencv安装目录下的dll动态库文件不用去重新编译修改,只是把源程序(如opencv函数cvCreatImage())找到直接加到自己新建的工程主cpp文件下面里面进行修改,并把函数名改一下(如cvCreatImage1()),直接调用修改后的函数即可。我觉得应该可以吧,不用修改dll。经典的东西是应该保留的,自己的东西因人而异。
Powered by}

我要回帖

更多关于 stvd工程里调用库函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信