OpenCV MFC 模块间通信
1. 新建MFC项目
点击完成。
2. 添加按钮
在“工具箱”中找到“Button”控件,添加至界面:
2. 配置opencv, 添加colordetector.h
#include<iostream>
#include "opencv2/opencv.hpp" using namespace std; class ColorDetector{
private:
//最小可接受距离
int minDist;
//目标色
cv::Vec3b target;
//结果图像
cv::Mat result;
public:
//构造函数
ColorDetector() : minDist()
{
//初始化默认参数
target[] = target[] = target[] = ;
}
//设置彩色距离阈值,阈值须为非负数
void setColorDistabceThreshold(int distance)
{
if (distance < )
distance = ;
minDist = distance;
}
//获取彩色距离阈值
int getColorDistanceThreshold() const
{
return minDist;
}
//设置需检测的颜色
void setTargetColor(unsigned char red, unsigned char green, unsigned char blue)
{
target[] = red;
target[] = green;
target[] = blue;
}
//设置需检测的颜色
void setTargetColor(cv::Vec3b color)
{
target = color;
}
//获取需检测的颜色
cv::Vec3b getTargetColor() const
{
return target;
}
//二值化处理函数
cv::Mat_<uchar> process(cv::Mat &image)
{
result.create(image.rows, image.cols, CV_8U);
//得到迭代器
cv::Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();
cv::Mat_<uchar>::iterator itout = result.begin<uchar>(); while (it != itend)
{
if (getDistance(*it) < minDist)
{
*itout = ;
}
else
{
*itout = ;
}
it++;//更新输入迭代器
itout++;;//更新输出迭代器
}
return result;
}
//计算颜色距离
int getDistance(const cv::Vec3b &color) const
{
cv::Vec3b dist;
cv::absdiff(color, target, dist);
return cv::sum(dist)[];
}
}; class ColorDetectController
{
private:
ColorDetector* cdetect;//算法类
cv::Mat image;//待处理的图像
cv::Mat result;//结果
public:
ColorDetectController()
{
cdetect = new ColorDetector();
}
//设置色彩距离阈值
void setColorDistanceThreshold(int distance)
{
cdetect->setColorDistabceThreshold(distance);
}
//获取色彩距离阈值
int getColorDistancethreshold() const
{
return cdetect->getColorDistanceThreshold();
}
//设置要检测的颜色
void setTargetColor(unsigned char red,
unsigned char green, unsigned char blue)
{
cdetect->setTargetColor(red, green, blue);
}
//获取要检测的颜色
void getTargetColor(unsigned char& red, unsigned char& green, unsigned char& blue) const
{
cv::Vec3b color = cdetect->getTargetColor();
red = color[];
green = color[];
blue = color[];
}
//设置输入图像,通过文件读取
bool setInputImage(string filename)
{
image = cv::imread(filename);
if (!image.data)
return false;
else
return true;
}
//返回当前的输入图像
const cv::Mat getInputImage() const
{
return image;
}
//开始处理图像
void process()
{
result = cdetect->process(image);
}
//获取最近一次处理的结果
const cv::Mat getLastResult() const
{
return result;
}
//删除当前控制器创建的处理对象
~ColorDetectController()
{
delete cdetect;
}
};
在3_2模块间通信.h 添加头文件 #include "colordetector.h"
在3_2模块间通信Dlg.h 添加公有成员 ColorDetectController controller;
3. 右击“Button1”,选择属性,将”Caption“属性改为”打开图像“,ID 属性改为 OpenImg。双击按钮添加代码段:
CFileDialog dlg(TRUE, _T("*.bmp"), NULL,
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
_T("image file(*.bmp;*,jpg)|*.bmp;*.jpg|ALL Files(*.*)|*.*||"), NULL); dlg.m_ofn.lpstrTitle = _T("Open Image");
// if a filename has been selected
if (dlg.DoModal() == IDOK) {
// get the path of the selected filename
CString strMfc = dlg.GetPathName();
std::string filename = CT2CA(strMfc.GetBuffer());
// set and display the input image
controller.setInputImage(filename);
cv::imshow("Input Image", controller.getInputImage());
}
右击“Button1”,选择属性,将”Caption“属性改为”处理图像“,ID 属性改为 ProcessImg。双击按钮添加代码段:
// target color is hard-coded here
controller.setTargetColor(, , );
// process the input image and display result
controller.process();
cv::imshow("Output Result", controller.getLastResult());
OpenCV MFC 模块间通信的更多相关文章
- Prism for WPF再探(基于Prism事件的模块间通信)
上篇博文链接 Prism for WPF初探(构建简单的模块化开发框架) 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实 ...
- Prism之使用EventAggregation进行模块间通信
在开发Silverlight程序的时候,经常需要在不同的组件间进行通信.比如点击一个button,可能就需要改变另一个控件的内容.比较直接的办法是使用事件,当然使用MVVM的时候也可以使用comman ...
- 如何使用Prism框架的EventAggregator在模块间进行通信
目的 本文主要介绍如何使用Prism类库提供的事件机制在松耦合组件之间相互通信,Prism类库的事件机制建立在事件聚合服务之上,允许发布者和订阅者通过事件进行通信,不需要彼此之间引用. 事件聚合 Ev ...
- 在Prism 框架中,实现主程序与模块间 UI 的通信
背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显 ...
- 系统间通信(10)——RPC的基本概念
1.概述 经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC.在后续的几篇文章中,我们首先讲解R ...
- Linux下多任务间通信和同步-信号
Linux下多任务间通信和同步-信号 嵌入式开发交流群280352802,欢迎加入! 1.概述 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式.信号可以直接进行用户空间进程和内核进程之间的 ...
- React 组件间通信介绍
React 组件间通信方式简介 React 组件间通信主要分为以下四种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件之间通信 非嵌套组件间通信 下面对这四种情况分别进行介绍: 父组件向子 ...
- Vue 根组件,局部,全局组件 | 组件间通信,案例组件化
一 组件 <div id="app"> <h1>{{ msg }}</h1> </div> <script src=" ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...
随机推荐
- Linux usb子系统(一):子系统架构
一.USB协议基础知识 前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB). ...
- python爬爬(网友提供学习)
import urllib2,urllib,os,re def ZZ(url): pathw=os.getcwd() #图片和标题目录 imagetitleregion=r'<div class ...
- mysql保存emoji表情(微信开发用户昵称..)
java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for colum n 'name' at row 1 at c ...
- CSS---------------之文本类型
通过font来改变文本,主要从以下几个方面 字体加粗,字体的风格:斜体和字体变形:小型大写字母 字体的大小 行高 字体 示例如下 p{font:italic 75%/125% "Comic ...
- mongo db 使用方法
1 下载 mogodb http://www.mongodb.org/display/DOCS/Downloads 2 打开服务 我安装在e盘下了 可以指定数据文件位置 到 E:\mongoDB\mo ...
- 【mysql】1206 SQLSTATE: HY000 (ER_LOCK_TABLE_FULL) 问题
最近在做一个项目,其中一需求是:部分数据库中的数据需要定时删除掉(满足一定条件,比如7天前的数据都不保留) 最初的执行方法: 使用Quartz定时执行数据库操作,进行数据删除,数据库操作使用delet ...
- 使用URLConnection获取网页信息的基本流程
参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...
- C# 操作系统回收站
主要目的:对系统回收站的文件进行操作. 首先添加引用,引入shell32.dll. /// <summary> /// 对回收站的文件进行还原.删除.剪切等操作 /// </summ ...
- bootstrap模态框垂直居中
很久没有写东西了,之前想写一些移动端的东西以后补上吧,移动端发展还是蛮快的,回正题. 因为最近在弄一个系统,系统中引用了bootstrap,发现模态框垂直不居中,遂搜索了一下,也都试了一下,无非都是在 ...
- ububru下 redmine安装教程
1.安装之前确认你已经安装好了mysql 2.连接mysql创建数据库 mysql -u root –p CREATE DATABASE redmine CHARACTER SET utf8; CRE ...