上位机图像处理和嵌入式模块部署(算法库的编写)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        作为图像处理的engineer来说,有时候我们需要提供上位机软件,有时候需要提供下位机程序,还有一种情况,虽然不多,但是也代表着一种商业合作模式。那就是,部分客户虽然没有算法开发的能力,但是他们还是有一定业务软件开发能力。这个时候,他们需要的其实就是一个算法库。

        那对于供应商来说,供应算法库这个肯定是一个基础能力,但是怎么保证自己的算法细节不被别人发现,并且在这过程中又尽可能方便自己的调试,这就是一门学问了。今天,我们简单来聊一下怎么编写算法库。

1、编写算法库

        图像算法尽量数据简单一些,但最好不要和平台有太大的联系。如果非要联系,可以再封装一层。在类构造的时候,尽量简单。只有外界设置长度和宽度的时候,才开始设置参数、分配内存。分配的内存也不要释放,只有软件关闭的时候,才去释放内存。算法的接口放在public区域,而算法的细节放在private区域。当然,如果需要调试的话,可以再实现一下dumpImage函数。

class ImageProcess
{
public:
	int width_;
	int height_;

private:
	void* pImage_;
	void* pGray_;
	void* pEnhanced_;
	void* pBinary_;
	void* pErode_;
	void* pDilate_;
	void* pResult_;

public:
	ImageProcess() 
	{
		width_ = 0;
		height_ = 0;
		pImage_ = NULL;
		pGray_ = NULL;
		pEnhanced_ = NULL;
		pBinary_ = NULL;
		pErode_ = NULL;
		pDilate_ = NULL;
		pResult_ = NULL;
	}
	
	~ImageProcess() 
	{
		if (pGray_) free(pGray_);
		if (pEnhanced_) free(pEnhanced_);
		if (pBinary_) free(pBinary_);
		if (pErode_) free(pErode_);
		if (pDilate_) free(pDilate_);
		if (pResult_) free(pResult_);
	}

	bool initData(int width, int height) 
	{ 
		pGray_ = (unsigned char*)malloc(width*height);
		pEnhanced_ = (unsigned char*)malloc(width*height);
		pBinary_ = (unsigned char*)malloc(width*height);
		pErode_ = (unsigned char*)malloc(width*height);
		pDilate_ = (unsigned char*)malloc(width*height);
		
		// result depend on final output
		return true;
	}

	bool processImage(void* pData, void** ppResult) 
	{
		/* ready to call private function here */

		return true;
	}

	void dumpImage(int level)
	{
		return;
	}

private:
	bool generateGrayImage(void* pSrc, void* pDst) 
	{
		return true;
	}

	bool doEnhancedImage(void* pSrc, void* pDst) 
	{ 
		return true; 
	}

	bool generateBinaryImage(void* pSrc, void* pDst) 
	{
		return true; 
	}

	bool doErodeImage(void* pSrc, void* pDst) 
	{
		return true; 
	}

	bool doDilateImage(void* pSrc, void* pDst) 
	{
		return true; 
	}

	bool getDataFromImage(void* pDst, void** pResult) 
	{
		return true; 
	}
};

2、编写给客户的接口

        给客户的接口文件,也就是通常所认为的头文件。头文件部分尽量简洁,最好就是类似于linux这种打开、关闭、读、写、控制五种接口。当然,我们今天编写的是图像处理程序,可以更加简单一点。

#ifndef RESULT_H_
#define RESULT_H_

    bool initData(int width, int height);
    bool processData(void* pData, void** ppResult);
    bool getWidth();
    bool getHeight();

#endif

        整个接口还是非常简洁的,甚至有点过于简洁。这中间的ppResult就是核心。一般来说,图像输出的可以是位置、距离、识别、大小、有没有错误等等,根据实际情况而定。

3、对接口的实现和封装

        前面说过ProcessImage是不会给客户的,但是头文件中的内容又过于简单,那么应该怎么处理呢。其实方法非常简单,只需要在cpp文件中实现一个全局变量就可以了,比如像这样,所有的实现细节就不会暴露出来了。

static ImageProcess gImageProcess;
bool initData(int width, int height)
{
	return gImageProcess.initData(width, height);
}

bool processData(void* pData, void** ppResult)
{
	return gImageProcess.processImage(pData, ppResult);
}

bool getWidth()
{
	return gImageProcess.width_;
}

bool getHeight()
{
	return gImageProcess.height_;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/355636.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

交换机跨VLAN交换数据ip跳转分析(不一定对)

在网上看到这样一个实验: 交换机1、交换机2分别连接到一台防火墙上,要求使VLAN 2、VLAN3、VLAN5、VLAN6中的终端可互相访问。 拓补 参考链接 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理_网管型交的机…

编程大侦探林浩然的“神曲奇遇记”

编程大侦探林浩然的“神曲奇遇记” The Coding Detective Lin Haoran’s “Divine Comedy Adventures” 在我们那所充满活力与创新精神的高职学院中,林浩然老师无疑是众多教师中最独特的一颗星。这位身兼程序员与心理分析专家双重身份的大咖,不仅能在电脑…

系统分析师-23年-下午题目

系统分析师-23年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答,二、三、四、五 四选二 试题一 (25分) 说明 某软件公司拟开发一套汽车租赁系统,科学,安全和方便的管理租赁公司的各项业务,提高公司…

部署个人知识库管理软件 MrDoc详细教程

效果 一、拉取 MrDoc 代码 进入目录: cd /opt开源版: git clone https://gitee.com/zmister/MrDoc.git专业版: git clone https://{用户名}:{密码}git.mrdoc.pro/MrDoc/MrDocPro.git二、拉取 Docker 镜像 docker pull zmister/mrdoc:v7三…

MS7338MA高清 HD/全高清 FHD 可选择视频运放与视频同轴线控解码

产品简述 MS7338MA 是一颗集成单通道视频放大器与视频同轴线控解 码为一体的芯片,它内部集成 12dB 增益轨到轨输出驱动器以及 10 阶滤波器,允许同一个输入信号在 -3dB 带宽 30MHz 和 45MHz 之间进行选择控制。视频同轴线控解码内部集成一颗高…

AI大语言模型学习笔记之三:协同深度学习的黑魔法 - GPU与Transformer模型

Transformer模型的崛起标志着人类在自然语言处理(NLP)和其他序列建模任务中取得了显著的突破性进展,而这一成就离不开GPU(图形处理单元)在深度学习中的高效率协同计算和处理。 Transformer模型是由Vaswani等人在2017年…

美化背景(拼图小游戏)

package Puzzlegame.com.wxj.ui;import javax.swing.*; import javax.swing.border.BevelBorder; import java.util.Random;public class GameJframe extends JFrame { //游戏主界面 //创建一个二维数组//目的:管理数据//加载图片的时候,会根据二维数组中…

漏洞原理MySql注入 Windows中Sqlmap 工具的使用

漏洞原理MySql注入 SQLmap是一款开源的自动化SQL注入工具,用于检测和利用Web应用程序中的SQL注入漏洞。以下是SQLmap工具的使用总结: 安装和配置:首先需要下载并安装SQLmap工具。安装完成后,可以通过命令行界面或图形用户界面来使…

ElasticSearch 学习笔记

基本概念 术语 文档(document):每条记录就是一个文档,会以 JSON 格式进行存储 映射(mapping):索引中文档字段的约束信息,类似 RDBMS 中的表结构约束(schema&#xff09…

操作系统论述题+第5、6、7、8、9章的知识小点总结(尤其是选择题)

文章目录 一、操作系统论述题怎么提高内存利用率?怎么提高CPU利用率?怎么提高操作系统并发度?这个答案也不知道是什么问题里面的 二、操作系统5、6、7、8、9章选择题知识点第五章:存储器管理第六章:虚拟存储器第七章&a…

Mysql-InnoDB-数据落盘

概念 1 什么是脏页? 对于数据库中页的修改操作,则首先修改在缓冲区中的页,缓冲区中的页与磁盘中的页数据不一致,所以称缓冲区中的页为脏页。 2 脏页什么时候写入磁盘? 脏页以一定的频率将脏页刷新到磁盘上。页从缓冲区…

TensorFlow Lite中文本分类在Android上的实践

#1 Tensorflow Lite TensorFlow Lite(后续简称TFL) 是 Google 开发的一个用于移动设备和嵌入式设备的开源库,旨在为移动终端设备提供机器学习推断。它是 TensorFlow 框架的轻量级版本,专门优化了模型的大小和性能,以适应资源受限的移动设备和嵌入式系统。 TFL 提供了一种在移…

【stm32】hal库学习笔记-FSMC连接TFT_LCD

【stm32】hal库学习笔记-FSMC连接TFT LCD 触摸屏结构与原理 LCD模块接口原理图 LCD 接口连接在 FSMC 总线上面,图中的 T_MISO/T_MOSI/T_PEN/T_SCK/T_CS 连接在 MCU 的 PB2/PF11/PB1/PB0/PC13 上,这些信号用来实现对液晶触摸屏的控制(支持电阻…

go语言函数进阶

1.变量作用域 全局变量 全局变量是定义在函数外部的变量,它在程序整个运行周期内都有效。 在函数中可以访问到全局变量。 package mainimport "fmt"//定义全局变量num var num int64 10func testGlobalVar() {fmt.Printf("num%d\n", num) /…

Linux——文件系统

我们的计算机中一定会有文件,我在之前的博客中已经介绍了内存中的文 件,也就是被打开的文件。但是有被打开的,那就有没有被打开的文件, 这一部分文件是在磁盘中的。我们平时用到的无非就是通过路径找到它,然 后对它进行…

AOP+Redisson 延时队列,实现缓存延时双删策略

一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案,但不管是单独在修改数据库之前,还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式,即在删除缓存之后&…

前端实现界面切换

样式切换主题 常用的主题切换实现方式之一,就是通过 link 标签的 rel 属性来实现的 当 rel 标签的值是 alternate,就代表该样式是可以替换的 title 属性要加就全加上或者全不加,因为 title 会导致系统直接识别成样式文件,意思就是…

DevSecOps 度量指标介绍

目录 一、度量指标概述 1.1 概述 二、度量指标内容介绍 2.1 指标概览 2.1.1 指标概览说明 2.1.2 指标概览图 2.1.3 指标概览图说明 2.2 必选指标 2.2.1 必选指标含义说明 2.2.2 必选指标内容 2.3 可选指标 2.3.1 可选指标含义说明 2.3.2 可选指标内容 一、度量指标…

北京大学:警惕ChatGPT等大模型遏制人类的创新能力

‍ 导语:这篇论文通过实验和跟踪调查,探讨了ChatGPT在有无的情况下对创新能力的影响。虽然ChatGPT能提升人的创新表现,但是当它停止工作时,创新性会回归基线。更为重要的是,使用ChatGPT可能导致内容同质化,…

C#使用DateTime结构的ParseExact方法和Parse方法分别将字符串转化为日期格式

目录 一、涉及到的知识点 1.ParseExact(String, String, IFormatProvider) 2.DateTime.ToLongDateString 方法 3.Parse(String)方法 二、实例1:ParseExact方法 1.源码 2.生成效果 3.示例2 三、实例2:Parse方法 在程序设计过程中,经…