工业相机开发操作流程

news2025/1/31 10:24:52

建议按照如下的流程操作相机(其中有一些步骤是可选的,已经标明):
一、载入SDK的动态链接库档MVCAMSDK.DLL。可以使用动态或者静
态加载两种方式。 
如果使用C/C++进行开发,在工程引用 CameraApi.h头文件(位于安装目录的SDK/DEMO/VC++/include中)和MVCAMSDK.lib库文件(位于安装目录的SDK文件夹中),然后就可以直接在工程中引用SDK中的接口函数了,但是MVCAMSDK.DLL必须和的应用程序放在同一目录下或者是系统的system32目录下,放置于其他目录时,必须设定系统的环境变量(PATH)。 
如果使用VB进行开发,可以通过我们VB6例程中类似的方法进行加载,直接定义SDK的接口函数并指明其引用的DLL文件即可。SDK\Demo\VB6\Module\CameraApi.bas模块囊括了所有的SDK接口,将MVCAMSDK.DLL中导出的每一个函数接口都映像
成了VB可以调用的函数。 
 如果使用Delphi进行开发,可以通过我们Delphi6例程中类似的方法进行加载,直接定义SDK的接口函数并指明其引用的DLL文件即可。SDK\Demo\Delphi6\Units\CameraApi.pas单元囊括了所有的SDK接口,将MVCAMSDK.DLL中导出的每一个函数接口都映像成了Delphi可以调用的函数。 
如果使用C#进行开发,可以通过我们C#例程中类似的方法进行加载,C#加载MVCAMSDK.DLL的过程和VB、Delphi类似,为了方便使用,我们的C# DEMO中提供了2个工程,一个是MVSDK,这个工程专门用来定义开发包数据结构和加载开发包的API函数,另一个是Basic工程,该工程中则实现了一个集预览、抓拍、相机设置为一体的例程。Basic工程通过调用MVSDK工程中的代码来间接访问MVCAMSDK.DLL。 
二、初始化SDK。完成了SDK的加载以后,在使用其他接口之前,请调用CameraSdkInit函数进行初始化。 
三、枚举设备。调用CameraEnumerateDevice函数枚举设备,获得当前连接到PC上的相机的设备列表,列表中包括设备名(可自己修改)、版本号、唯一序列号、相机型号等信息。 
四、初始化设备。根据第三步中获得的相机设备枚举信息,调用CameraInit函数初始化指定的相机,得到相机的句柄。如果需要同时打开多个相机,则利用多个相机的设备名多次调用CameraInit来获得多个相机的句柄,后续对相机的操作,都需要此时获得的相机句柄来指定操作的相机
对象。 
五、让SDK进入图像采集模式。调用CameraPlay函数,让相机进入工作模式,并且SDK开始接收来自相机的图像。 
六、抓取图像。MindVision SDK提供了两种获得图像数据的方式,这两种方式的效率都是一样的,底层都使用了零拷贝机制来提高效率,可以根据的开发习惯来选择其中一种。 
主动调用CameraGetImageBuffer来获取一帧图像数据。该函数会获得一个SDK内部用来接收图像数据的缓冲区地址,以及帧头信息。同时,该函数可以设定超时时间,在指定的时间内没有获取到图像(线程会被挂起),则返回超时。在第三步中,初始化相机以后,调用CameraSetCallbackFunction来设定一个回调函数。这种方式是被动的,只有在SDK内部接收到
有效的图像数据帧后,才会调用设定的回调函数来传递收到的图像数据帧。 
注意:也可以同时使用以上两种方式来获取图像,但是不能在CameraSetCallbackFunction设定的回调函数中来调用CameraGetImageBuffer再次获取图像,这样会产生死锁问题。 
七、处理图像。上一步获取的图像帧,是相机输出的原始格式,大多数型号相机,原始输出都是Bayer格式或者YUV格式,这些格式信息会被自动添加到帧头信息中,调用CameraImageProcess来获得图像处理的效果,如颜色增益调整、白平衡校正、饱和度、LUT变换、降噪等等,并将YUV或者Bayer格式的原始数据转换为24BIT的位图格式(RGB888)。 
八、迭加十字线、自动曝光参考窗口、白平衡参考窗口等附加内容(如果开发中,不需要迭加信息,这一步可以略过)。调用CameraImageOverlay函数,被设置为可见状态的十字线、自动曝光参考窗口、白平衡参考窗口,将被迭加到输入的图像上。CameraImageOverlay的输入必须是位图格式,我们建议在调用CameraImageProcess得到位图格式后,再调用CameraImageOverlay函数。
九、将图像保存或者显示图像(如果的开发中,对图像进行别的处理,而不需要将图像保存成文件或者进行显示,这一步可以略过)。 
如果需要保存图像到文件中,在第六步、第七步或者第八步后,调用CameraSaveImage函数来保存图片,MindVision SDK支持PNG、BMP、JPG和原始数据四种方式。如果要保存原始数据,应该在第六步以后就调用CameraSaveImage函数;如果保存成BMP、PNG、JPG格式,应该在第七步后调用CameraSaveImage数:如果保存成BMP、PNG、JPG格式的同时,需要迭加十字线和自动曝光、白平衡参考窗口的位置,那么可以在第八步后调用CameraSaveImage函数。 
如果需要显示图像,有以下两个方式:
a. 自己根据开发环境来实现图像显示,例如利用OpenGL、DirectDraw、Windows GDI等方式来实现图像的显示。 
b. 利用我们的SDK里封装好的显示接口来显示图像。在第四步中初始化相机后,调用CameraDisplayInit函数来初始化显示接口,该函数需要传入显示控件的句柄(HWND类型),只适合VC/C++、VS、VB、VB.NET、Delphi、C#等使用Windows GDI开发接口的工具,是有一定的局限性,但如果满足使用的条件,我们还是建议使用我们封装好的显示接口。 
十、在退出程序前关闭相机(反初始化,非常重要,如果直接关闭程序而不反初始化相机,程序有可能会报内存错误)。在关闭相机时,调用CameraUnInit函数。

 

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

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

相关文章

DeepSeek-R1 模型及GRPO算法学习

总结DeepSeek-R1 模型算法,并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法,开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型,在多个推理任务上表现出色,并开源模型推动…

爬虫基础(二)Web网页的基本原理

一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

AJAX笔记入门篇

黑马程序员视频地址: 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2https://www.bilibili.com/video/BV1MN411y7pw?vd_source…

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.1项集(Itemset) 1.2规则(Rule) 1.3支持度(Support) 1.3.1 支持度的定义 1.3.2 支持度的意义 1.3.3 支持度的应用 1.3.4 支持度的示例 1.3.5 支持度的调整 1.3.6 支持度与其他指标的…

危机13小时:追踪一场GitHub投毒事件

事件概要 自北京时间 2024.12.4 晚间6点起, GitHub 上不断出现“幽灵仓库”,仓库中没有任何代码,只有诱导性的病毒文件。当天,他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒,等待不…

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…

buu-rip-好久不见26

简单的栈溢出,找到后面函数和输入的个数即可

2025一区新风口:小波变换+KAN!速占!

今天给大家分享一个能让审稿人眼前一亮,好发一区的idea:小波变换KAN! 一方面:KAN刚中稿ICLR25,正是风口上,与小波变换的结合还处于起步阶段,正是红利期,创新空间广阔。 另一方面&a…

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…

系统思考—蝴蝶效应

“个体行为的微小差异,可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说,小变动带来大影响,这种现象,在复杂系统理论中被称为“蝴蝶效应”:即使极小的变化,也能在动态系…

钉钉群机器人设置——python版本

钉钉群机器人设置——python版本 应用场景钉钉界面操作程序开发效果展示 应用场景 由于工作需要,很多项目执行程序后出现报错信息无法第一时间收到,因此实时预警对于监控程序还是有必要。(仅个人观点) 参考文档及博客&#xff1a…

【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.0.1 指针的基本概念 指针是一个变量在内存中包含的是一个地址,指向另一个数据。 Rust 中最常见的指针是引用&#xff0c…

Spring AI 在微服务中的应用:支持分布式 AI 推理

1. 引言 在现代企业中,微服务架构 已成为开发复杂系统的主流方式,而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI,使多个服务可以协同完成 AI 任务,并支持分布式 AI 推理&#x…

QT串口通信,实现单个温湿度传感器数据的采集

1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破:从零开始的推理能力进化DeepSeek R1-Zero:纯RL训练的“自我觉醒”DeepSeek R1:冷启动与多阶段训练的平衡之道 实验验证:推理能力的全方位跃升基准测试:超越顶尖闭源模型蒸馏技术:小模型的…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时,都会出现在一个对话框里面存在好多的选项,导致对话框变得非常长或者非常大,就会显现的不美观,在这种情况下通常是添加一个页面的滚动条来解决这个问题,下面我们就来介绍给MFC的对话…

php接口连接数据库

框架:https://www.thinkphp.cn/doc 创建网站 域名自己写 创建文件夹,“test”拉取框架,地址栏输入 composer create-project topthink/think5.1.* tp5 会自动创建一个tp5文件夹 根目录选择刚刚创建拉框架的文件夹 以test为示例 “D:\test\…

【卫星通信】链路预算方法

本文介绍卫星通信中的链路预算方法,应该也适用于地面通信场景。 更多内容请关注gzh【通信Online】 文章目录 下行链路预算卫星侧参数信道参数用户侧参数 上行链路预算链路预算计算示例 下行链路预算 卫星侧参数 令卫星侧天线数为 M t M_t Mt​,每根天线…