在OpenCV库中新增自定义函数和修改库函数

来源:互联网 发布:社区app软件 编辑:程序博客网 时间:2024/05/16 14:11

在OpenCV库中新增自定义函数和修改库函数

OpenCV库函数功能强大,但是有时候并不能满足我们搞图像处理的,所以有时候想修改库函数或者新增自定义函数,然后在自己编写的程序中像OpenCV那样调用它。修改库函数比较简单,新增自定义函数也不是很复杂。下面给大家一个修改OpenCV库函数文章。

一、修改OpenCV库函数

先要下载cmake对OpenCV进行编译。

‘’我给的文章有cmake编译链接,很简单,选好自己的VS版本,比如我是VS2010,我就选生成的文件是VS2010版本的OpenCV.sln文件。打开.sln文件,就可以看见OpenCV的C++源码了。

准备工作完毕,则开始修改库函数。

‘’(注意:这里是修改库函数里面的代码,如果您想新增自定义参数,请看本文的第二节“新增自定义函数”,因为修改库函数代码和新增参数或者新增库函数不是一个方法。)链接的文章讲的比较清楚了,这里也不再赘述,如果有什么不懂的地方,您可以私信我。

二、在OpenCV中新增自定义函数

新增库函数的参数和新增自定义函数是一个道理,心细的同学可以看出,没编译之前,我们用OpenCV做图像处理时,需要在VS中在项目中添加OpenCV相关.dll文件和.lib文件,所以我们新增库函数也需要修改对应的.dll文件和.lib文件。

在VS中打开OpenCV.sln文件,添加您自己定义的函数需要以下步骤:

‘’我以在modules下的opencv_imgproc项目中添加自定义C++代码函数“newCorner()”为例。

1、打开“imgproc.hpp”

‘’opencv_imgproc项目中找到Include文件夹并打开,,是C++语言写的,“imgproc_c.h”是C语言头文件,如果你是C语言编写的,那就打开这个个文件。

2、添加自定义函数

‘’找到代码中很多库函数定义语句处,仿造OpenCV库函数定义的代码写进去**,比如看图:
这里写图片描述图中“newCorner()”是我自定义函数,注意图像格式Mat类型也要转换成InputArray类型,再在自定义函数中添加如下语句:

Mat img=_img.getMat();

其实大家可以参考OpenCV库函数写,它怎么改的我们也怎么改,这样在重新生成的时候不会出错。

3、在cpp中添加函数代码

‘’文件包含文件写进了函数,保存一下,然后打开该项目下的Src文件夹,看到很多cpp文件,你可以添加cpp文件,也可以打开某个cpp文件再添加你的自定义函数代码。我这里为了以后好查找修改,自己添加了cpp文件,命名为“newCorner.cpp”,我也建议我们自己添加单独的cpp文件,以后好查找修改。

4、#include里写什么呢?

‘’因为你本身在OpenCV库函数中,所以可以不需要再#include< opencv2/……hpp>类似的代码了,不过你也可以写,应该没关系,我是没写。涉及到什么就#include什么就行。

5、复制你的C++源代码。

‘’将测试没问题的函数代码复制过来,要确保没问题,有问题在这上面调试很麻烦很麻烦,建议之前测试100%没问题就复制过来。复制过来需要改的地方不太多,不过有几个重要的。

1)你等下在外部项目中调用这个自定义“newCorner”函数时,除了刚才所说的参数种Mat全部换成InputArray类型外,还需要在函数前面加上cv::,比如void cv::newCorner(InputArray _img),然后再函数第一行加第二步所提到的语句就可以随意使用Mat类型,其他非调用函数可以不修改。

2)对于非调用函数参数,无需修改其他地方,但是如果在外面也需要单独调用该函数,就需从第一步跟newCorner函数一样加入相关代码。

比如看下面的一段代码:

......void Fmans(Mat img)//只能是被该cpp调用的函数写法{    ......}void cv::newCorner(InputArray _img)//需要被外部调用函数写法{    Mat img=_img.getMat();    Fmans(img);    .......}

从上面一段代码就一个很好理解了,具体原理需要懂得C++,对我来说C++是硬伤,就不想去深究了。

6、重新生成dll和lib文件。

‘’现在选择“opencv_imgproc”项目,鼠标右击,点击“重新生成”,会提示“重新生成工作开始..”,耐心等待一会,如果出现“重新生成完成”,那么恭喜你,程序编译通过了,注意只是通过了,并不代表代码跑起来没有问题。如果“重新生成失败”,然后下面一大堆问题,不着急,对着问题自己一个一个修改,修改过程中对照OpenCV库函数,它们怎么写的,你也就跟着怎么修改的就好了,如果修改后还是有问题,没关系,多查查问题,相信通过自己的细心观察会解决好这些问题的, 也可以私信我和我交流,我能力也有限,我们共同探讨问题解决问题。

7、替换.lib和.dll。

‘’重新生成成功之后,找到OpenCV.sln所在文件夹,找到bin文件夹并打开,再打开Debug文件夹,找到“opencv_imgproc2410d.dll”文件。(这里我是在opencv_imgproc项目中修改的并成功重新生成,所以我找“opencv_imgproc2410d.dll”文件,如果你是修改其他项目的代码,那么需要找到您所修改项目对应名称的.dll文件,这里要注意看清楚是.dll文件。)复制“opencv_imgproc2410d.dll”文件,找到您安装的opencv目录,打开build->x86->vc10->bin,点击粘贴,选替换。
‘’这个路径是因项目而异,根据您所创建的外部项目中链接OpenCV库的路径,可以选择项目右击->属性->配置属性->VC++目录->库目录,把.dll文件放到该目录下的bin文件里即可。同样的,”opencv_imgproc2410d.lib”文件就放在lib文件夹里。建议都保存一下之前相关的.dll和.lib文件。ok了!

8、最后一步,写的好累。

‘’回到您的外部项目,当你满怀欣喜的敲入cv::,发现并没有这个newCorner()函数,很伤心,前面的都白写了?no!你回到你安装opencv的目录下,打开build->include->opencv2->imgproc->imgproc.hpp,这里跟第一步一样加入那句代码–“CV_EXPORTS_W void newCorner……”,保存就可以了。你重新回到您的项目中,再次cv::,发现newCorner没?如果没有,可以私信我,如果看见了,就自己默默开心一下。

**总结

修改库函数比较简单,注意的地方比较少,新增库函数后你就把自定义函数看成是OpenCV的 库函数。如果你只是修改函数里面的代码,只需要按照第一节说的那样,只需要替换.dll文件就行了,如果是修改库函数参数,或者新增,就安装第二节那样做。图片很少,基本上都是文字叙述,啰啰嗦嗦地说完了。只是希望自己走错的路不想让别人也走,在新增或者修改时遇到什么问题都可以和我交流,共同提高进步,我自己也是被逼无奈自己瞎琢磨出来的,可能有些不对的地方,望见谅,谢谢!

0 0