相机开启图像采集与结束图像采集的步骤

2023-11-20

如何开启图像采集线程与关闭该线程,步骤如下:

一、按下采集按钮,开始创建一个图像采集线程

// ch:按下开始采集按钮 | en:Click Start button
void CBasicDemoDlg::OnBnClickedStartGrabbingButton()
{
    if (FALSE == m_bOpenDevice || TRUE == m_bStartGrabbing || NULL == m_pcMyCamera)
    {
        return;
    }

    memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));
    m_bThreadState = TRUE;
    unsigned int nThreadID = 0;
    m_hGrabThread = (void*)_beginthreadex( NULL , 0 , GrabThread , this, 0 , &nThreadID );
    if (NULL == m_hGrabThread)
    {
        m_bThreadState = FALSE;
        ShowErrorMsg(TEXT("Create thread fail"), 0);
        return;
    }

    int nRet = m_pcMyCamera->StartGrabbing();
    if (MV_OK != nRet)
    {
        m_bThreadState = FALSE;
        ShowErrorMsg(TEXT("Start grabbing fail"), nRet);
        return;
    }
    m_bStartGrabbing = TRUE;
    EnableControls(TRUE);

    return;
}

在按下采集按钮事件中,使用_beginthreadex开启一个图像采集线程。

同时定义成员函数,保存线程的状态,线程的句柄


    void*           m_hGrabThread;              // ch:取流线程句柄 | en:Grab thread handle
    BOOL            m_bThreadState;          //线程状态

二、 采集过程

具体的线程执行函数

// ch:取流线程 | en:Grabbing thread
unsigned int __stdcall GrabThread(void* pUser)
{
    if (NULL == pUser)
    {
        return -1;
    }

    CBasicDemoDlg* pCam = (CBasicDemoDlg*)pUser;//MFC窗体

    pCam->GrabThreadProcess();

    return 0;
}

具体的图像采集函数

int CBasicDemoDlg::GrabThreadProcess()
{
    // ch:从相机中获取一帧图像大小 | en:Get size of one frame from camera
    MVCC_INTVALUE_EX stIntValue = {0};

    int nRet = m_pcMyCamera->GetIntValue("PayloadSize", &stIntValue);
    if (nRet != MV_OK)
    {
        ShowErrorMsg(TEXT("failed in get PayloadSize"), nRet);
        return nRet;
    }
    unsigned int nDataSize = (unsigned int)stIntValue.nCurValue;

    if (NULL == m_pGrabBuf || nDataSize > m_nGrabBufSize)
    {
        if (m_pGrabBuf)
        {
            free(m_pGrabBuf);
            m_pGrabBuf = NULL;
        }

        m_pGrabBuf = (unsigned char *)malloc(sizeof(unsigned char) * nDataSize);
        if (m_pGrabBuf == NULL)
        {
            return 0;
        }
        m_nGrabBufSize = nDataSize;
    }

    MV_FRAME_OUT_INFO_EX stImageInfo = {0};
    MV_DISPLAY_FRAME_INFO stDisplayInfo = {0};

    while(m_bThreadState)
    {
        EnterCriticalSection(&m_hSaveImageMux);
        nRet = m_pcMyCamera->GetOneFrameTimeout(m_pGrabBuf, m_nGrabBufSize, &stImageInfo, 1000);
        if (nRet == MV_OK)
        {
            memcpy(&m_stImageInfo, &stImageInfo, sizeof(MV_FRAME_OUT_INFO_EX));
        }
        LeaveCriticalSection(&m_hSaveImageMux);

        if (nRet == MV_OK)
        {
            if(RemoveCustomPixelFormats(stImageInfo.enPixelType))
            {
                continue;
            }
            stDisplayInfo.hWnd = m_hwndDisplay;
            stDisplayInfo.pData = m_pGrabBuf;
            stDisplayInfo.nDataLen = stImageInfo.nFrameLen;
            stDisplayInfo.nWidth = stImageInfo.nWidth;
            stDisplayInfo.nHeight = stImageInfo.nHeight;
            stDisplayInfo.enPixelType = stImageInfo.enPixelType;

            m_pcMyCamera->DisplayOneFrame(&stDisplayInfo);
        }
        else
        {
            if (MV_TRIGGER_MODE_ON ==  m_nTriggerMode)
            {
                Sleep(5);
            }
        }
    }

    return MV_OK;
}

 我们可以看到,主要是通过一个While循环判断线程的状态,来不断的通过相机API图像信息stDisplayInfo

三、 结束采集

// ch:按下结束采集按钮 | en:Click Stop button
void CBasicDemoDlg::OnBnClickedStopGrabbingButton()
{
    if (FALSE == m_bOpenDevice || FALSE == m_bStartGrabbing || NULL == m_pcMyCamera)
    {
        return;
    }

    m_bThreadState = FALSE;
    if (m_hGrabThread)
    {
        WaitForSingleObject(m_hGrabThread, INFINITE);
        CloseHandle(m_hGrabThread);
        m_hGrabThread = NULL;
    }

    int nRet = m_pcMyCamera->StopGrabbing();
    if (MV_OK != nRet)
    {
        ShowErrorMsg(TEXT("Stop grabbing fail"), nRet);
        return;
    }
    m_bStartGrabbing = FALSE;
    EnableControls(TRUE);

    return;
}

我们可以看到,先将线程状态置为False,再等待线程执行完成,同时将线程句柄置为NULL,调用相机API关闭采集。

具体代码见海康的demo。

四、总结

我们可以以此类推,其他的应用场景。需要开启线程,等待线程结束都可以使用这种方式。比如串口通信,网口通信等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

相机开启图像采集与结束图像采集的步骤 的相关文章

  • CentOS 8安装并配置NFS服务

    先决条件 我们假设您有一台运行CentOS 8的服务器 我们将在该服务器上设置NFS服务器和其他充当NFS客户端的计算机 服务器和客户端应该能够通过专用网络相互通信 如果您的托管服务提供商不提供私有IP地址 则可以使用公共IP地址并配置服务
  • Python学习第十二天——logging

    1 日志级别 CRITICAL 50 FATAL CRITICAL ERROR 40 WARNING 30 WARN WARNING INFO 20 DEBUG 10 NOTSET 0 不设置 日志的设置是自下而上的 如果等级为ERROR
  • vs2008常用操作汇总

    1 OpenCV2 1环境配置 1 Tools gt Options gt Projects and Solutions gt VC Drectories Show directories for选择include files 加入目录 D
  • Android-给RecyclerView添加分隔线

    RecyclerView和ListView不同 是不自带分隔线的 如此 在讲为Item加入分割线本质的前 先来介绍 认识一下ChildView 也就是平时我们用到的ListView RecyclerView中的getChildAt int
  • 【解决】Win 10+Visual Studio community 2017,许可证到期,不能登录问题

    Win 10 Visual Studio community 2017 许可证到期 不能登录问题 试了很多种方式 会出现很多问题 最终尝试成功 1 在打开vs之后 第一时间点击帮助 发送反馈 报告问题 2 在弹出的对话框中点击发现新的许可证
  • UCI提供给shell和lua使用的配置接口

    转自 http m blog csdn net article details id 47989493 1 uci提供给shell使用的配置借口有两套 1 config get用来读取一个config值 命令格式如下 config getv

随机推荐

  • 【Python爬虫】Python 爬虫的学习和案例,一篇文章带你了解爬虫的密码

    爬虫基础 我们可以把互联网比作一张大网 而爬虫 即网络爬虫 便是在网上爬行的蜘蛛 把网的节点比作一个个网页 爬虫爬到这就相当于访问了该页面 获取了其信息 可以把节点的连线比作网页与网页之间的链接关系 这样蜘蛛通过一个节点后 可以顺着节点连线
  • Linux系统下载并安装Redis

    Linux上下载并安装Redis 下面是下载安装过程 如果只是想快速安装 那就直接看图中命令 全部下载安装命令都在图中 1 在home目录下下载Redis安装包 下载Redis安装包命令 wget http download redis i
  • html5取消了哪些标签,html5删除的标签有哪些

    html5删除的标签 basefont big center font s strike tt u frame noframes frameset bgsound blink marquee applet isindex listing等
  • 使用函数打印无符号整形的二进制表达式

    目录 目录 目录 1 问题描述 输入两个非负整数a b 并输出这两个整数的二进制形式以及这两个数的反码执行逻辑或和逻辑与操作后的二进制形式 2 三个函数作用的详细解释 2 1第一个函数 2 2第二个函数 2 3第三个函数 3 结语 请多多指
  • 一招解决Tomcat闪退

    tomcat的运行需要JRE 一般启动闪退都是因为找不到JRE 也就是说环境安装JDK时环境变量没有配置好 首先检查JDK配置是否正确 确认JDK配置好了以后开始检查错误 在Tomcat的安装目录下的bin文件夹里面找到startup ba
  • 在Windows11系统中安装Anaconda

    1 在电脑自带的应用商店下载或者去Anaconda官网下载 Anaconda官网 2 打开Anaconda官网 如下图 3 点击Download 选择自己电脑对应的版本 这里选择Windows 4 将下载的Anaconda 放在电脑的某个地
  • Python手册(Scientific Computing)--numpy

    文章目录 NumPy的ndarray 创建ndarray ndarrary索引和切片 ndarrary属性 ndarrary方法 numpy函数 NumPy的random随机库 生成n维随机数组 Numba NumPy Numerical
  • 大话数据结构读书笔记 1---线性表

    大话数据结构读书笔记 编程基础 数据结构 算法 1 线性表 顺序储存结构的结构代码 define MAXSIZE 20 储存空间的起始分配量 typedef int ElemType ElemType类型根据实际类型而定 这里假设是int
  • framebuffer驱动详解

    1 framebuffer介绍 1 什么是framebuffer 1 裸机中如何操作LCD 2 OS下操作LCD的难点 显存放在内核中还是应用中是个问题 之前讲的应用和内核之间传递数据用的是copy from usr copy to usr
  • dell灵越笔记本后盖怎么拆_戴尔灵越5584笔记本按键拆卸、安装教程

    最近一直用笔记本 用着用着我发现U键变得迟钝 不灵敏 虽然这是小问题 但对于我的打字造成较大影响 去维修站修又有点浪费 所以就萌生了自己修的念头 发现网上笔记本键帽拆卸的教程不好用 便决定写篇教程 方便他人 第一步 关机 在拆卸笔记本任何部
  • 2023蓝桥杯python 组试题A:2023

    题目 请求出在 12345678 至 98765432 中 有多少个数中完全不包含 2023 完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 例如 20322175 33220022 都完全不包含 2023 而 2
  • 记录一次生产环境MySQL死锁以及解决思路

    一 背景 1 业务背景 这里因为涉及到公司的业务问题不进行深入讨论 下面换成通用的一些业务场景就是举例 2 技术背景 众所周知 所谓锁的产生本质上是想解决资源竞争问题 在MySQL的前提下 MySQL为了解决事务并发独写的问题 在进行ins
  • Ubuntu查看cuda版本号 cudnn版本号

    cuda版本号 nvcc V nvcc version 若遇到 nvcc command not found 添加环境变量 打开 bashrc 添加环境变量如下 export LD LIBRARY PATH usr local cuda l
  • 常用系统命令

    重定向 cat aa txt gt bbb txt 将输出定向到bbb txt cat aaa txt gt gt bbb txt 输出并追加 查看进程 ps ps ef 显示所有进程 例 ps ef grep mysql 管道符 kill
  • webpack从此不再是我们的痛点 — 核心基础

    webpack一直是前端工程师的痛点 因为他的复杂 分散 loader plugin这些第三方 让我们的学习成本陡然上升 使我们一直对他的配置模棱两可 今天带大家彻底明白他如何配置 摆脱困扰我们很久的痛点 本篇主要是webpack基础配置详
  • Proximal Policy Optimization(PPO)和文本生成

    ChatGPT的RLHF步使用了强化学习PPO算法 PPO是一种策略梯度方法 其交替地进行与环境交互采样数据和使用随机梯度上升优化 代理 目标函数 标准策略梯度方法对每个数据样本执行一次梯度更新 而PPO可以采样一批数据后 对模型进行多次梯
  • 大数据复习笔记——hive

    这次主要讲解一下平常使用较多的数据仓库hive 目录 一 Hive 1 Hive的介绍 2 Hive的搭建模式 a 内嵌Derby模式 b Local方式 c Remote方式 3 Hive的数据库和表操作 a 创建数据库 b 删除数据库
  • mysql-bin.index文件_MySQL 启动报错:File ./mysql-bin.index not found (Errcode: 13)

    Linux下安装初始化完MySQL数据库之后 使用mysqld safe启动mysql数据库 如下发现 启动失败 root SVNServer bin mysqld safe user mysql 或 root SVNServer bin
  • 简单看看很好用的Vite

    前言 Vite对于前端到底需不需要打包提出了自己的观点 在某些情况下他做的确实更好 打包 首先回顾一下什么是打包 从结果导向来看 打包使得开发人员所写的代码和最终运行的代码是不甚相同的两个样子 这样做有什么好处呢 在HTTP2普及之前 浏览
  • 相机开启图像采集与结束图像采集的步骤

    如何开启图像采集线程与关闭该线程 步骤如下 一 按下采集按钮 开始创建一个图像采集线程 ch 按下开始采集按钮 en Click Start button void CBasicDemoDlg OnBnClickedStartGrabbin