目的:获取某图片指定位置的颜色。

实现该目的的方法有很多,但为了有助于扩充自己技术广度,所以决定采用标题中的方法来完成。

没有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报错等等,这里就不细说了。

创建一个C++制作的包含Opencv功能的dll,供C#程序使用的更多相关文章

  1. SQL-33 创建一个actor表,包含如下列信息

    题目描述   创建一个actor表,包含如下列信息 列表 类型 是否为NULL 含义 actor_id smallint(5) not null 主键id first_name varchar(45) ...

  2. (JAVA作业)练习:创建一个类名为Fruit;包含实例变量:水果名称,颜色,价格,上市月份,有无种子 10个实例:苹果,香蕉,芭乐,柚子,李子,杨桃,猕猴桃,哈密瓜,葡萄,榴莲; 实现功能:提示用户输入水果品种编号,输出该水果的全部信息。

    class Lei { String name; String color; int price; int date; int num; String zz; void assemble(){ Sys ...

  3. oracle学习 五 使用存储过程创建一个重置密码为123456的功能(持续更新中)

    首先写一个函数是MD5的方法 create FUNCTION GET_MD5 ( p_str in varchar2) RETURN varchar2 IS BEGIN RETURN Utl_Raw. ...

  4. 使用 CodeIgniter 创建一个简单的 Web 站点

    原文:使用 CodeIgniter 创建一个简单的 Web 站点 参考源自: http://www.ibm.com/developerworks/cn/web/wa-codeigniter/index ...

  5. CodeIgniter框架——创建一个简单的Web站点(include MySQL基本操作)

    目标 使用 CodeIgniter 创建一个简单的 Web 站点.该站点将有一个主页,显示一些宣传文本和一个表单,该表单将发布到数据库表中. 按照 CodeIgniter 的术语,可将这些需求转换为以 ...

  6. 创建一个基于ViSP的图片显示程序

    创建一个图片读取,并在windows下窗口显示的程序. #include <visp/vpDisplayD3D.h> #include <visp/vpDisplayGDI.h> ...

  7. TDirectory.CreateDirectory 完整、严谨的创建一个目录

    描述:创建一个目录,不包含多级目录(多级目录使用System.SysUtils.ForceDirectories,Vcl.FileCtrl.ForceDirectories已过时) procedure ...

  8. 使用Scrapy创建一个爬虫

    使用Scrapy创建一个爬虫 创建项目 您可以使用下面的命令来创建 Scrapy 项目: scrapy startproject 项目名称 例:scrapy startproject scrapy_p ...

  9. 创建一个类Person

    创建一个类Person,包含以下属性:姓名(name).年龄(age).朋友(friends数组).问候(sayhi方法,输出问候语,例如:"你好!").交朋友(addFriend ...

随机推荐

  1. Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  2. 爬虫实现:根据IP地址反查域名

    域名解析与IP地址 域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务:IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址.域名解析 ...

  3. Hystrix降级逻辑中如何获取触发的异常

    通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...

  4. 编译部署mysql5.7.13

    署环境centos7.2+mysql5.7.131.依赖包注: 相关依赖包的作用cmake:由于从 MySQL5.5 版本开始弃用了常规的 configure 编译方法,所以需要 CMake 编译器, ...

  5. 推荐数据库、Web、Net、架构的PDF数据,书不在多,在看!

    先收藏,后看:千万不要做一个屯书的人,一定要坚持有选择性的看下去: 数据库类 SqlServer Oracle .NET  更多... Web  更多... 架构 不刮了,直接可以看到了. 链接: h ...

  6. RNN-LSTM入门

    RNN-LSTM入门 Last Edited: Dec 02, 2018 10:20 PM Tags: 机器学习,论文阅读 RNN-Recurrent Neural Network 概念: 序列数据: ...

  7. [MySQL] INFORMATION_SCHEMA 数据库包含所有表的字段

    sql注入后可以通过该数据库获取所有表的字段信息 1. COLLATIONS表 提供有关每个字符集的排序规则的信息. COLLATIONS表包含以下列: COLLATION_NAME 排序规则名称. ...

  8. json接口返回值

    SpringBoot响应客户端渲染数据 1.SpringBoot构造并且返回一个json对象 首先,我们在父包下新建一个pojo的包,并新建一个User类  IDEA自动生成对应的get/set,然后 ...

  9. Hibernate入门(五)---------事务管理

    在Hibernate中,可以通过代码来操作管理事务,如通过“Transaction tx = session.beginTransaction()”,开启一个事务,持久化操作后,通过"tx. ...

  10. Python中字典dict

    dict字典 字典是一种组合数据,没有顺序的组合数据,数据以键值对形式出现 # 字典的创建 # 创建空字典1 d = {} print(d) # 创建空字典2 d = dict() print(d) ...