目的:获取某图片指定位置的颜色。
实现该目的的方法有很多,但为了有助于扩充自己技术广度,所以决定采用标题中的方法来完成。
没有C++编程经验,也没有制作C++版Opencv语法经验,也没有制作dll的经验,整个流程牵涉比较多的技术环节,每个环节需要一个一个测试通过,才能进行后续设计。
由于网上太多零散信息,没有很好的参考资料,大多只能靠自己实践测试,所以从开始,到跨机各种环境测试,整整花了1天半。
现在问题全部解决了,回头想想,流程太简单了!
开发环境:
Win7系统
VS2017
Opencv 3.4.0
主流程:
(1)搭建C++版Opencv开发环境,并测试需要定制的功能应该怎么写
(2)借助C++和Opencv定制特定功能的dll
(3)编写C#简单winform应用程序,测试dll
详细:
1.搭建C++版Opencv开发环境 (源自YouTube)
1.1 创建C++空项目
项目名称为OpenCVTest
1.2 下载Openc包
到官网,下载指定版本的opencv,解压后,就是几个文件夹。我存放的路径是:
1.3 配置刚才创建的C++项目属性
勘误:上述图片路径注释中,将vc14改为vc15.
注意:上述平台我选的是X64。
1.4 将F:\dream\10\20181031\Extermal Libraries\OpenCV\x64\vc15\bin中两个.lib文件夹放到OpenCVTest工程中
1.5 在刚才的工程文件中新建一个main.cpp文件,并在里面编写测试代码。(注意运行时,要选X64)
运行结果:
至此,注意功能代码和环境测试通过。
2 制作dll (主要参考:https://blog.csdn.net/zhangzhe_0305/article/details/78399224)
2.1 新建C++空项目,并按照大纲1中的方法,在三个地方写上opencv的路径
2.2 在解决方案头文件下--新建项--头文件(.h),并在里面编写如下代码:
2.3 在源文件文件下--新建项--C++文件(.cpp),并在该文件中写入你要定制的函数:
2.4 源文件文件夹下--新建项--模块定义文件(.def):
2.5 生成dll文件:
(1)在工程上右键--属性--配置--常规:
(2)重新生成整个解决方案(Debug和Release模式都可以,但记得选X64)
重新生成时,会报一个错误,具体原因不知道,但是可用的dll已经生成了。
具体的dll在:解决方案所在目录,Debug目录下即可找到生成的 .dll 文件。
3 新建C#测试程序,测试dll(http://blog.sina.com.cn/s/blog_e6a105580102xcdx.html)
(1)新建一个C#winform程序
(2)将Opencv.dll(自编写的函数封装)、opencv_world340.dll(opencv3.4.0版本,OpenCV\x64\vc15\bin文件夹内)、opencv_world340d.dll(opencv3.4.0版本,OpenCV\x64\vc15\bin文件夹内)三个文件放在C#工程文件下的bin/Debug文件夹内。
(3)在项目--属性--窗口内选择X64平台
(4)运行程序,结果如下:
总结:
(1)目前发现,用VS2017编写的dll均能够供vs2010,vs2015,vs2017C#程序使用,只需放入3个dll,而不需要在另一台机器上配置opencv环境。唯一注意的是,dll是X64平台编写的,C#程序也需要时X64
(2)C++操作opencv相对于python操作opencv还是复杂多了,不过在某些追求速度的场景亦或者使用c#快速开发UI界面的场景,该方法还是很有优势的。
(3)其中还出现了各种小问题,比如由于图片路径不存在,C#程序中dll报错等等,这里就不细说了。