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

news2024/12/24 9:58:06

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 index
    public List<string> list_imgs;// img  file name list
    public 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 Do
    string 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中的代码,并且附上范例代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Windows API每日一练》9.1 资源-图标

本节讲述图标、鼠标指针位图、字符串资源表、自定义资源的添加和应用。 本节必须掌握的知识点&#xff1a; 图标 第56练&#xff1a;ICON图标资源 鼠标指针位图 字符串资源表 自定义资源 第57练&#xff1a;字符串资源表和自定义资源 9.1.1 图标 在 Windows 窗口编程中&…

西门子老将,跳槽ABB当CEO~

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 近日&#xff0c;全球领先的电力和自动化技术公司ABB宣布了…

Python | Leetcode Python题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution:def computeArea(self, ax1: int, ay1: int, ax2: int, ay2: int, bx1: int, by1: int, bx2: int, by2: int) -> int:area1 (ax2 - ax1) * (ay2 - ay1)area2 (bx2 - bx1) * (by2 - by1)overlapWidth min(ax2, bx2) - …

allWebPlugin中间件实现ActiveX插件在谷歌、火狐、Edge浏览器使用

下载并安装allWebPlugin中间件 1、请从下面地址下载allWebPlugin中间件产品&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1xUyQDzOabh7mU7J7TYhtig?pwdz3q0 提取码&#xff1a;z3q0 如下图所示&#xff0c;下载最新allWebPlugin_x86_v2.0.0.14_stable_20240707…

用XDR的思路保护API安全

云计算飞速发展的今天&#xff0c;越来越多应用程序已经转为选择云原生架构&#xff0c;这就少不了Serverless、微服务、API等技术的协助。 但同时也有越来越多的企业认识到&#xff0c;一定程度的“API安全”在整体安全与合规态势中发挥着至关重要的作用。然而&#xff0c;对…

华为eNSP:HCIA综合实验

一实验要求 HCIA综合实验的配置要求&#xff1a; 1.ISP路由器只能配置IP地址&#xff0c;之后不进行任何配置 2.内部整个网络基于192.168.1.0/24进行地址划分 3.R1/2之间启动OSPF协议&#xff0c;单区域 4.PC1-4自动获取IP地址 5.PC1-4&#xff0c;可以访问PC5&#xff0c;R2…

macbook触控栏养宠物:Touchbar pet for Mac 免费下载

macbook pro自从出了touchbar后&#xff0c;看起来是十分的炫酷&#xff0c;但平时却很少有人使用&#xff0c;为了让touchbar充分利用起来&#xff0c;Touch bar pet就横空出世了&#xff0c;可爱的画风&#xff0c;简单的玩法&#xff0c;让你可以在touchbar上也可以养一只自…

使用 Qt 和 ECharts 进行数据可视化

文章目录 示例图表预览折线图散点图柱状图使用 Qt 和 ECharts 进行数据可视化一、准备工作1. 安装 Qt2. 准备 ECharts二、在 Qt 中使用 ECharts1. 创建 Qt 项目2. 配置项目文件3. 在 UI 中添加 WebEngineView4. 加载 ECharts三、创建折线图、散点图和柱状图1. 折线图2. 散点图3…

8.8.8.8 IP地址的作用

在跟着韦东山老师的学习手册中看见了关于8.8.8.8 IP用于检测网络状态&#xff0c;然后搜索了关于此IP的相关作用如下&#xff1a; 公共DNS服务&#xff1a;8.8.8.8是Google提供的两个公共DNS服务器地址之一&#xff08;另一个是8.8.4.4&#xff09;。DNS&#xff08;域名系统&a…

Windows右键没有新建Word、PPT与Excel的解决方法

本文介绍在Windows电脑中&#xff0c;右键与资源管理器的“新建”选项中&#xff0c;都没有新建Word、PPT或Excel文件的解决方法。 最近&#xff0c;发现一台重装了系统与Office的电脑中&#xff0c;无论是桌面上与资源管理器中的右键&#xff0c;还是资源管理器左侧顶部的“新…

【机器学习】(基础篇二) —— 监督学习和无监督学习

监督学习和无监督学习 本文介绍机器学习的分类&#xff0c;监督学习和无监督学习 监督学习 监督学习&#xff08;Supervised Learning&#xff09;是机器学习的一个核心分支&#xff0c;大部分的机器学习任务都是由监督学习完成的。 它涉及到使用带有标签的训练数据来训练模…

【C语言】测试TCP带宽程序

多线程测带宽 服务端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/epoll.h> #include <time.h> #include <pthrea…

Spring Boot:连接MySQL错误Public Key Retrieval is not allowed

环境&#xff1a; MySQL版本&#xff1a;8.0.17 SpringBoot版本&#xff1a;2.5.15 解决 解决方式很简单&#xff0c;在数据库配置连接字符串spring.datasource.url末尾添加&allowPublicKeyRetrievaltrue即可&#xff0c;如下图&#xff1a; 重新启动&#xff0c;恢复正常…

const括号前括号后

const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数 隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改。 代码 class Date{public:Date(int year, int month, int day){_year …

C++的入门基础

目录 C的简单介绍命名空间命名空间的使用C的输入与输出缺省参数函数重载 C的简单介绍 本贾尼斯特劳斯特卢普博士在C的基础上增加了面向对象的特性&#xff0c;这时又增加了继承和、类、封装的概念&#xff0c;为后来的面向对象的编程奠定了基础&#xff0c;这被命名为C 命名空…

UDP通讯实现

服务器端&#xff1a; 1.获取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…

LabVIEW中自定义Ring控件的图标

在LabVIEW中&#xff0c;自定义Ring控件的图标可以让用户界面更加直观和友好。以下是如何在LabVIEW中自定义Ring控件的图标的详细步骤&#xff1a; 步骤1&#xff1a;创建或获取图标 首先&#xff0c;你需要创建或获取你想要在Ring控件中使用的图标。你可以使用图像编辑软件&…

前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)

在实际项目中&#xff0c;有效利用Vue3的响应式系统提高性能主要涉及以下几个关键点&#xff1a; 1. 合理使用reactive和ref reactive&#xff1a;用于将复杂的数据结构&#xff08;如对象或数组&#xff09;转换成响应式版本。确保只将需要实时更新的数据结构声明为响应式&am…

VsCode崩溃无法打开解决办法

今天打开电脑 点开vscode突然不能使用了 每次点开都闪退,于是查找解决办法 直接重启电脑 这个方法没有解决问题 删除软件 重新安装软件 软件删干净之前保存下自己的配置文件 比如扩展和settings.json和keybinding.json Mac系统 在 /Users/用户名/.vscode/extensions 和/User…

jmeter测试工具学习

1.双击jar包打开&#xff0c;发现那个bat打不开 2.新建plan之后编辑添加线程组 会加入500*5次请求 3.添加HTTP请求 添加字段 为了让http请求发送到不同的分片&#xff0c;要把userid随机化 4.添加监听器 5.聚合报告