# YMCV **Repository Path**: qqclient/ymcv ## Basic Information - **Project Name**: YMCV - **Description**: ymkv-2.0版本(可移植任意平台),平台从codeblocks迁移到vs,并经过一些架构调整和算法优化,取消了user层的集合封装,以便链接器能进行优化,对未使用的部分不进行加载,减少不必要内存消耗,另外集成了近150个demo,并附带测试视频以便大家使用参考。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 101 - **Created**: 2022-12-29 - **Last Updated**: 2022-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # YMCV简介 库名中文简称 **妖米CV**,英文全称 **your mini computer vision**,意为你的迷你计算机视觉,含义有双重,第一重含义是:一个迷你的CV库;第二重含义是:可用于迷你计算机(如嵌入式计算机)的视觉库。 这个库是跨平台的,源码由C语言编写,可以在任意平台编译,这个库也可以通过选择开启部分功能从而实现将库裁剪到你所必须的大小,降低对小型计算机的源码空间占用 ## 项目起源 起源于我的个人需要,于2019年暑假完成了YMKV图像处理库编写,当时主要为了运行在stm32上,编写环境是MDK。 而后为了方便验证算法,将其移植到PC环境上开发,除了算法以外,诸如显示,鼠标位置获取,输入等这些交互的内容,借用EGE库来完成。老粉估计知道,最初我使用CodeBlocks开发,但考虑很多人不怎么用它,后面换到了vs2019上进行开发。 ## 项目架构 这个项目的架构经过多次改良,目前确定了一款耦合度最小的架构,方便与任意平台兼容;另一方面为了方便大家使用,和原始的库相比,采用面向对象的方式进行了重构。 ![](./使用说明图片/YMCV核心架构.png) 项目分为三层架构,顶层是用户层,它是对核心层的包裹,方便用户对他进行调用,核心层的内容为左边那列内容,其中黑体的QRcode是二维码相关的编码和解码功能,这部分我是将第三方库进行了压缩打包,底层congfig是配置信息,内存管理以及IO文件接口的定义。 > 文件接口是由宏定义来完成,由于读写图片,如果移植到嵌入式可用我之前发布的uFatfs文件系统,他是基于Fatfs的封装,以便兼容c标准库stdio的文件系统。图中右侧文件IO以及Debug都是独立于核心层的,只依赖底层的配置。 ## 项目代码命名规则 为了方便辨认数据类型,我约定的命名规则,平台通用数据类型用全小写 ``` int8,int16,uint8,uint16,uint32,float32,..... ``` 自定义数据类型的话,需要加CV头: > 结构体采用CV+小写 > > ```c > //图像 > typedef struct > { > uint16 width; > uint16 height; > CVImgType type; > _color8_t* data; > }CVimage; > ``` > > 结构体指针采用CV+大写 > > ```c > typedef CVimage* CVIMAGE; > ``` > > 枚举类型CV+大小写混合(单词首字大写) > > ```c > //图像类型 > typedef enum > { > CVBinaryType = 1,// 二值图 > CVTrimapType,//三色图 > CVGrayType,//灰度图 > CVRgb16Type,//RGB565 > CVFGrayType,//float gray > CVIGrayType,//int gray > CVCGrayType,//complex gray > }CVImgType; > ``` > > 函数名: YMCV+首字母大写 > > ```c > //创建一张空图像 > CVIMAGE YMCV_Creat_Img_Creat(uint16 width,uint16 height, CVImgType Imgform) > { > .... > .... > } > ``` ## 项目文件分布说明 打开项目我们能看到如下几个文件夹,其中最重要的是YMCV部分,移植库只需要该部分 > -- EGELIB :交互和显示的库 > -- EGE_LCD:基于ege库,搭建用于YMCV的显示和交互功能 函数 > -- ImageSource:用于演示的图片数据,这里是c的数组文件 > > -- Demo:用于演示库的使用例程,里面有大部分函数的使用方法。我为这个库配备了150多个Demo供大家使用参考 > > -- YMCV:算法库的源码部分 打开YMCV文件夹,文件列表如下: > -- -- CONFIG:算法库的配置,移植其他平台的话只需要修改该文件夹的内容 > > -- -- OPOBJ:算法使用到的对象管理,对象创建和销毁 > > -- -- CORE:算法核心源码部分 > > -- -- USER:用户层封装,可以使用 YMCV.funName(...) 方式调用函数 > > -- -- DEBUG:调试工具,可以提示错误信息 > > -- -- IOFILE:和文件相关的操作,该库使用到的文件读写部分都在这边,比如图片和视频的读写 > > -- -- Code:jpeg,avi,gif等的编码和解码 > > -- -- QRCODE:条码,二维码,AprilTag相关的内容 # 项目使用说明 ## 运行示例demo 首先你需要安装一下vs2019,然后下载这个项目并打开(x86-Debug模式),展开demo筛选器: ![](./使用说明图片/demo0.png) 先运行环境测试,鼠标移到 0、EGE_Test.c上,右键,并选择属性,就能看到 ![](/使用说明图片/文件属性查看.png) 然后将 **是** 改成 **否** 即可,然后点击运行,能出现如下画面即可: ![](./使用说明图片/demoOk.png) 测试完成后,将其属性重新设置为从生成中排除,选择你要打开的Demo,将排除属性选择否即可。 ## 移植其他平台 如移植stm32平台,首先需要将YMCV文件夹拷贝走 添加到你的项目下 然后打开CONFIG文件夹下的文件进行修改 首先我们打开YMCV_Mem.c文件,该文件管理则YMCV库的动态计算内存,我们将其改为自己的内存函数 然后我们打开YMCV_PubDefine.h文件,该文件管理着一些常数定义,如果我们用到文件操作,需要修改文件系统定义部分,换成我们自己平台下的文件系统函数(若使用Fatfs,可以使用我封装过的uFatfs) 最后打开YMCV_PubType.h文件看一眼,大部分时候该文件都不会需要修改 最后我们直接编译即可 .... ## 更多教程 [哔哩哔哩 - 妖米猫人主页](https://space.bilibili.com/314022084) 我比较懒,估计更新的比较慢,帮我剪视频的小伙伴工作了时间也不多,更新的就更慢了。。。我自己剪的比较拉跨,没什么太大动力。