当前位置: 首页 > news >正文

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片

2.5 C#视觉程序开发实例1----CamManager实现模拟相机采集图片

1 目标效果视频

CamManager

2 CamManager读取本地文件时序

在这里插入图片描述

3 BD_Vision_Utility添加代码

3.0 导入链接库
  1. BD_OperatorSets.dll
  2. System.Windows.Forms.dll
  3. OpencvSharp
3.1 导入VisionParam中创建的文件Util_FileOP

并且添加代码GetFileNamewithextension,用于罗列文件夹中所有图片文件

/// <summary>
/// GetFileNamewithextension/// </summary>/// <param name="FilePath"></param>/// <param name="FileName"></param>public void GetFileNamewithextension(string FilePath, ref List<string> FileName){//获取指定文件夹下的文件夹名try{FileName.Clear();if (FolderExist(FilePath)){string[] StrFileName = Directory.GetFiles(FilePath);for (int i = 0; i < StrFileName.Length; i++){string extension = System.IO.Path.GetExtension(StrFileName[i]);//扩展名 “.aspx”if (extension == ".png" || extension == ".bmp" || extension == ".jpg" || extension == ".jpeg")FileName.Add(StrFileName[i]);}}}catch (Exception ex){throw new Exception("GetFileNamewithextension :" + ex.Message);}}
3.2 创建CamManager.cs
3.2.1 变量创建
/// <summary>
/// ImageFile_HANDLE
/// </summary>
private struct ImageFile_HANDLE
{public int n_index;// 当前img file indexpublic List<string> list_imgs;// img  file name listpublic void  Release(){n_index = -1;list_imgs.Clear(); }public ImageFile_HANDLE(int a=0){n_index = -1; list_imgs = new List<string>();}
}
private int camCount;/// <summary>
/// imgfiles_cams
/// 管理各个相机的文件资源
/// </summary>
private ImageFile_HANDLE[] imgfiles_cams;
3.2.2 Constructor
public Cam_Manager(int _camCount) 
{if (_camCount < 1) _camCount = 1;camCount = _camCount;imgfiles_cams = new ImageFile_HANDLE[camCount];for(int i=0;i< camCount;i++){imgfiles_cams[i] = new ImageFile_HANDLE();}
}
3.2.3 open(int CamNO)
/// <summary>
/// 打开相机
/// </summary>
/// <returns></returns>
public int Open(int CamNO)
{int nRet = 0;if (CamNO < 0 || CamNO > camCount - 1) return -1;// To Dostring camFiles_path = Application.StartupPath + "\\camSimulator\\Cam" + CamNO.ToString();ContextManager.get_fileopCtx().GetFileNamewithextension(camFiles_path, ref imgfiles_cams[CamNO].list_imgs);if (imgfiles_cams[CamNO].list_imgs.Count > 0) imgfiles_cams[CamNO].n_index = 0;else{nRet = -1; }return nRet;
}
3.2.4 grab(ref Mat ,ing CamNo)
public int Grab(ref Mat himg_tmp,int CamNO)
{
int nRet = 0;
if (CamNO < 0 || CamNO > camCount - 1) return -1;
if (himg_tmp == null) return -1; try
{if (imgfiles_cams[CamNO].list_imgs.Count > 0)// 文件夹中有图片{// 读取图片索引imgfiles_cams[CamNO].n_index = imgfiles_cams[CamNO].n_index % imgfiles_cams[CamNO].list_imgs.Count;// NewImage = Cv2.ImRead( ContextManager.getCamCtx().AcqHandle[CamNO].list_imgs[ ContextManager.getCamCtx().AcqHandle[CamNO].n_index], ImreadModes.Color);BD_OperateSet.Assign_Temp(ref himg_tmp, Cv2.ImRead(imgfiles_cams[CamNO].list_imgs[imgfiles_cams[CamNO].n_index], ImreadModes.AnyColor));imgfiles_cams[CamNO].n_index++;}else MessageBox.Show("Cam" + CamNO.ToString() + "没有图像来源");
}
catch (Exception ex)
{nRet = -2;
}
return nRet;
}
3.2.5 close()关闭相机
public int Close()
{int nRet = 0;// To Do for(int i=0;i<camCount;i++)imgfiles_cams[i].Release();Array.Clear(imgfiles_cams,0, imgfiles_cams.Length);return nRet;
}
3.3 ContextManager中增加一个CamManager的实例|FileOP的实例

实现自动的资源管理和初始化

//Cam_Manager 
private static Cam_Manager cam_Ctx;
public static Cam_Manager get_camCtx()
{if (cam_Ctx == null) cam_Ctx = new Cam_Manager(4);return cam_Ctx;
}
//  FileOP Manager
private static Util_FileOP fileop_Ctx;
public static Util_FileOP get_fileopCtx()
{if (fileop_Ctx == null) fileop_Ctx = new Util_FileOP();return fileop_Ctx;
}
4 下一节 我们会实现Form_Vision中的代码,并且附上范例代码

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python杨辉三角的两种书写方式
  • LLM代理应用实战:构建Plotly数据可视化代理
  • 【区块链农场】:农场游戏+游戏
  • Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪
  • 使用node-cmd重启electron
  • 常见的开源工具(代码托管平台)都有哪些
  • 前端预览图片的两种方式:转Base64预览或转本地blob的URL预览,并再重新转回去
  • 纹波电流与ESR:解析电容器重要参数与应用挑战
  • 水库大坝安全监测险情主要内容
  • el-date-picker 限制选择六个月内的日期
  • [图解]SysML和EA建模住宅安全系统-13-时间图
  • xss攻击
  • 容器之docker compose
  • 《简历宝典》08 - 简历中“教育背景”模块如何扬长避短
  • 48、DR+keepalive
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Bootstrap JS插件Alert源码分析
  • js写一个简单的选项卡
  • k8s 面向应用开发者的基础命令
  • Mac转Windows的拯救指南
  • ReactNativeweexDeviceOne对比
  • Spark RDD学习: aggregate函数
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 浮动相关
  • 聊聊directory traversal attack
  • 如何学习JavaEE,项目又该如何做?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 树莓派 - 使用须知
  • -- 数据结构 顺序表 --Java
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (+4)2.2UML建模图
  • (C++17) optional的使用
  • (备份) esp32 GPIO
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)Mysql的优化设置
  • (转载)Google Chrome调试JS
  • ******之网络***——物理***
  • .DFS.
  • .gitignore文件设置了忽略但不生效
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net6 webapi log4net完整配置使用流程
  • .net的socket示例
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @Autowired 和 @Resource 区别的补充说明与示例