C#用SDK打开海康工业相机,callback取图Bitmap格式,并保存
上次写了python版本的,但是python虽好不方便发布,她带着重重的解释器有时候不方便玩耍.于是C#来了哦.
C#图像一般用Bitmap表示,所以完全C#就够,别的格式可以自行想转换.
命令行哦,没界面.
MVCamera.cs从MVS示例里面添加到项目中,using MvCamCtrl.NET; 就可以,不需要添加mvcameracrtlnet.dll引用;
build BMP的部分程序是自动生成 后面我人工调试出来的.
using System;using MvCamCtrl.NET;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using SC = System.Console;using System.IO;using System.Threading;
using System.Diagnostics.Eventing.Reader;
using static System.Net.Mime.MediaTypeNames;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Grab_Callback
{class Grab_Callback{public static MyCamera.cbOutputExdelegate ImageCallback;public static MyCamera device = new MyCamera();public static Bitmap buildBMP(int width, int height, byte[] imgBytes){Bitmap bmp;bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),ImageLockMode.WriteOnly, bmp.PixelFormat);Marshal.Copy(imgBytes, 0, bmpData.Scan0, imgBytes.Length);bmp.UnlockBits(bmpData);// EventTask.Runreturn bmp;}public static byte[] m_BufForDriver1=null;public static Bitmap Bbmp = null;private static Bitmap bmpNow;public static string Getcwd = System.Environment.CurrentDirectory + "\\";public static Bitmap buildBMP(int width, int height, byte[] imgBytes, bool isGrayScale){Bitmap bmp;if (isGrayScale){bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);ColorPalette palette = bmp.Palette;for (int i = 0; i < palette.Entries.Length; i++){palette.Entries[i] = Color.FromArgb(i, i, i);}bmp.Palette = palette;}else{bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);}BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),ImageLockMode.WriteOnly, bmp.PixelFormat);Marshal.Copy(imgBytes, 0, bmpData.Scan0, imgBytes.Length);bmp.UnlockBits(bmpData);return bmp;}static void ImageCallbackFunc(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser){string x = $"{pFrameInfo.nWidth}/" + $"{pFrameInfo.nHeight}:" + $"{pFrameInfo.nFrameNum} ";m_BufForDriver1 = new byte[pFrameInfo.nFrameLen];Marshal.Copy(pData, m_BufForDriver1, 0, ((int)pFrameInfo.nFrameLen));// 检查图像是否为灰度图// bool isGrayScale = pFrameInfo.nPixelFormat == MyCamera.MV_PIXEL_FORMAT.MONO8 ||// pFrameInfo.nPixelFormat == MyCamera.MV_PIXEL_FORMAT.MONO16; // 根据实际像素格式常量进行调整Bbmp = buildBMP(pFrameInfo.nWidth, pFrameInfo.nHeight, m_BufForDriver1, false);Bbmp.Save(Getcwd + pFrameInfo.nFrameNum.ToString() + ".bmp", ImageFormat.Bmp);SC.WriteLine(x);}static void Main(string[] args){int nRet = MyCamera.MV_OK;MyCamera.MV_CC_Initialize_NET();// ch: 初始化 SDK | en: Initialize SDKdo{// ch:枚举设备 | en:Enum deviceMyCamera.MV_CC_DEVICE_INFO_LIST stDevList = new MyCamera.MV_CC_DEVICE_INFO_LIST();nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref stDevList);if (MyCamera.MV_OK != nRet){Console.WriteLine("Enum device failed:{0:x8}", nRet);break;}Console.WriteLine("Enum device count : " + Convert.ToString(stDevList.nDeviceNum));if (0 == stDevList.nDeviceNum){break;}MyCamera.MV_CC_DEVICE_INFO stDevInfo; // 通用设备信息// ch:打印设备信息 en:Print device infofor (Int32 i = 0; i < stDevList.nDeviceNum; i++){stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));if (MyCamera.MV_GIGE_DEVICE == stDevInfo.nTLayerType){MyCamera.MV_GIGE_DEVICE_INFO_EX stGigEDeviceInfo = (MyCamera.MV_GIGE_DEVICE_INFO_EX)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO_EX));uint nIp1 = ((stGigEDeviceInfo.nCurrentIp & 0xff000000) >> 24);uint nIp2 = ((stGigEDeviceInfo.nCurrentIp & 0x00ff0000) >> 16);uint nIp3 = ((stGigEDeviceInfo.nCurrentIp & 0x0000ff00) >> 8);uint nIp4 = (stGigEDeviceInfo.nCurrentIp & 0x000000ff);Console.WriteLine("[device " + i.ToString() + "]:");Console.WriteLine("DevIP:" + nIp1 + "." + nIp2 + "." + nIp3 + "." + nIp4);Console.WriteLine("ModelName:" + stGigEDeviceInfo.chModelName + "\n");}else if (MyCamera.MV_USB_DEVICE == stDevInfo.nTLayerType){MyCamera.MV_USB3_DEVICE_INFO_EX stUsb3DeviceInfo = (MyCamera.MV_USB3_DEVICE_INFO_EX)MyCamera.ByteToStruct(stDevInfo.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO_EX));Console.WriteLine("[device " + i.ToString() + "]:");Console.WriteLine("SerialNumber:" + stUsb3DeviceInfo.chSerialNumber);Console.WriteLine("ModelName:" + stUsb3DeviceInfo.chModelName + "\n");}}Int32 nDevIndex = 0;Console.Write("Please input index(0-{0:d}):", stDevList.nDeviceNum - 1);try{nDevIndex = Convert.ToInt32(Console.ReadLine());}catch{Console.Write("Invalid Input!\n");break;}if (nDevIndex > stDevList.nDeviceNum - 1 || nDevIndex < 0){Console.Write("Input Error!\n");break;}stDevInfo = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(stDevList.pDeviceInfo[nDevIndex], typeof(MyCamera.MV_CC_DEVICE_INFO));// ch:创建设备 | en:Create devicenRet = device.MV_CC_CreateDevice_NET(ref stDevInfo);if (MyCamera.MV_OK != nRet){Console.WriteLine("Create device failed:{0:x8}", nRet);break;}// ch:打开设备 | en:Open devicenRet = device.MV_CC_OpenDevice_NET();if (MyCamera.MV_OK != nRet){Console.WriteLine("Open device failed:{0:x8}", nRet);break;}// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)if (stDevInfo.nTLayerType == MyCamera.MV_GIGE_DEVICE){int nPacketSize = device.MV_CC_GetOptimalPacketSize_NET();if (nPacketSize > 0){nRet = device.MV_CC_SetIntValueEx_NET("GevSCPSPacketSize", nPacketSize);if (nRet != MyCamera.MV_OK){Console.WriteLine("Warning: Set Packet Size failed {0:x8}", nRet);}}else{Console.WriteLine("Warning: Get Packet Size failed {0:x8}", nPacketSize);}}// ch:设置触发模式为off || en:set trigger mode as offnRet = device.MV_CC_SetEnumValue_NET("TriggerMode", 0);if (MyCamera.MV_OK != nRet){Console.WriteLine("Set TriggerMode failed:{0:x8}", nRet);break;}// ch:注册回调函数 | en:Register image callbackImageCallback = new MyCamera.cbOutputExdelegate(ImageCallbackFunc);nRet = device.MV_CC_RegisterImageCallBackEx_NET(ImageCallback, IntPtr.Zero);if (MyCamera.MV_OK != nRet){Console.WriteLine("Register image callback failed!");break;}// ch:开启抓图 || en: start grab imagenRet = device.MV_CC_StartGrabbing_NET();if (MyCamera.MV_OK != nRet){Console.WriteLine("Start grabbing failed:{0:x8}", nRet);break;}Console.WriteLine("Press enter to exit");Console.ReadLine();// ch:停止抓图 | en:Stop grabbingnRet = device.MV_CC_StopGrabbing_NET();if (MyCamera.MV_OK != nRet){Console.WriteLine("Stop grabbing failed:{0:x8}", nRet);break;}// ch:关闭设备 | en:Close devicenRet = device.MV_CC_CloseDevice_NET();if (MyCamera.MV_OK != nRet){Console.WriteLine("Close device failed:{0:x8}", nRet);break;}// ch:销毁设备 | en:Destroy devicenRet = device.MV_CC_DestroyDevice_NET();if (MyCamera.MV_OK != nRet){Console.WriteLine("Destroy device failed:{0:x8}", nRet);break;}} while (false);if (MyCamera.MV_OK != nRet){// ch:销毁设备 | en:Destroy devicenRet = device.MV_CC_DestroyDevice_NET();if (MyCamera.MV_OK != nRet){Console.WriteLine("Destroy device failed:{0:x8}", nRet);}}// ch: 反初始化SDK | en: Finalize SDKMyCamera.MV_CC_Finalize_NET();Console.WriteLine("Press enter to exit");Console.ReadKey();}}
}
相关文章:
C#用SDK打开海康工业相机,callback取图Bitmap格式,并保存
上次写了python版本的,但是python虽好不方便发布,她带着重重的解释器有时候不方便玩耍.于是C#来了哦. C#图像一般用Bitmap表示,所以完全C#就够,别的格式可以自行想转换. 命令行哦,没界面. MVCamera.cs从MVS示例里面添加到项目中,using MvCamCtrl.NET; 就可以,不需要添加mvca…...
C语言字符学习初级优先看这个就够了
1. 字符的基本概念 在C语言中,字符(char)是一个基本的数据类型,用来表示单个字符。字符用单引号( )括起来,例如 a、1 等。字符在内存中实际上是以整数的形式存储的,即 ASCII 码。例…...
Python JSON
JSON 函数 json.dumps 语法 实例 json.loads 语法 实例 使用第三方库:Demjson 环境配置 JSON 函数 encode 语法 实例 decode 语法 实例 JSON 函数 使用 JSON 函数需要导入 json 库:import json。 函数描述json.dumps将 Python 对象编码…...
【华为杯】2024华为杯数模研赛F题 解题思路
题目 X射线脉冲星光子到达时间建模 问题背景 高速公路拥堵现象的原因众多,除了交通事故外,最典型的就是部分路段出现瓶颈现象,主要原因是车辆汇聚,而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点,如匝道出…...
Object Pascal 结构化程序设计
Object Pascal 关系运算符 运算符名称等于<>不等于>大于<小于>大于等于<小于等于< (属于元素的)包含于> (属于元素的)包含in (属于元素的)属于 # Object Pascal 逻辑运算符 运算符名称含义Not逻辑非单目运算符,进行取反操作,由T…...
机器学习算法与实践_03概率论与贝叶斯算法笔记
1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目,是通过对 样本 的分析,来评估/估计 总体 的情况,与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…...
如何使用Privoxy将SOCKS5代理转换为HTTP代理?
在这篇博客中,我将介绍如何使用Privoxy将SOCKS5代理转换为HTTP代理。我们将从下载和安装Privoxy开始,接着配置Privoxy,最后配置Windows以便浏览器使用该代理。 1. 下载并安装Privoxy 首先,您需要下载并安装Privoxy。您可以从Pri…...
AJAX(一)HTTP协议(请求响应报文),AJAX发送请求,请求问题处理
文章目录 一、AJAX二、HTTP协议1. 请求报文2. 响应报文 三、AJAX案例准备1. 安装node2. Express搭建服务器3. 安装nodemon实现自动重启 四、AJAX发送请求1. GET请求2. POST请求(1) 配置请求体(2) 配置请求头 3. 响应JSON数据的两种方式(1) 手动,JSON.parse()(2) 设置…...
Git进阶(十五):Git LFS 使用详解
文章目录 一、介绍二、Git LFS 使用步骤三、场景示例四、拓展阅读 一、介绍 Git LFS (Large File Storage) 是一个 Git 扩展,它使 Git 更适合处理大型文件,如音频、视频、图像或任何其他二进制大文件。Git LFS 替换仓库中的大文件为文本指针文件&#x…...
操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述
5.1 I/O管理概述 5.1.1 I/O设备 注:块设备可以寻址,但是字符设备是不可寻址的 I/O设备是将数据输入到计算机中,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件; 设备的分类 按使用特性分类ÿ…...
关于es的一个多集群、多索引切换的实现
首先是封装了一个类里定义了关于集群名称和集群节点;以及关于索引的名称和集群的名称做一个关联;将多个集群封装存储得到类中 /*** es集群类*/ Data public class EsClusterConfig implements Serializable {/*** 集群名称*/private String name;/*** 集…...
Linux系统编程(基础指令)上
1.Linux常见目录介绍 Linux目录为树形结构 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录&…...
【STM32 Blue Pill编程】-定时器PWM模式
定时器PWM模式 文章目录 定时器PWM模式1、定时器PWM模式介绍2、硬件准备及接线3、模块配置4、代码实现在文中,我们将介绍如何使用 STM32 Blue Pill 定时器的PWM模式以及如何配置它们以生成具有不同占空比和频率的信号。 我们将使用 LED调光器示例来演示如何使用 STM32Cube IDE…...
数字英文验证码识别 API 对接说明
数字英文验证码识别 API 对接说明 本文将介绍一种 数字英文验证码识别 API 对接说明,它是基于深度学习技术,可用于识别变长英文数字验证码。输入验证码图像的内容,输出验证码结果。 接下来介绍下 数字英文验证码识别 API 的对接说明。 注册…...
稳了,搭建Docker国内源图文教程
大家好,之前分享了我的开源作品 Cloudflare Workers Proxy,它的作用是代理被屏蔽的地址,理论上支持代理任何被屏蔽的域名,使用方式也很简单,只需要设置环境变量 PROXY_HOSTNAME 为被屏蔽的域名,最后通过你的…...
零工市场小程序:推动零工市场建设
人力资源和社会保障部在2024年4月发布了标题为《地方推进零工市场建设经验做法》的文章。 零工市场小程序的功能 信息登记与发布 精准匹配、推送 在线沟通 权益保障 零工市场小程序作为一个找零工的渠道,在往后随着技术的发展和政策的支持下,功能必然…...
回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测
回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SSA-HKELM麻雀算法优化混合核极限学习机多变量…...
VCNet论文阅读笔记
VCNet论文阅读笔记 0、基本信息 信息细节英文题目VCNet and Functional Targeted Regularization For Learning Causal Effects of Continuous Treatments翻译VCNet和功能目标正则化用于学习连续处理的因果效应单位芝加哥大学年份2021论文链接[2103.07861] VCNet和功能定向正…...
Python 装饰器使用详解
文章目录 0. 引言1. 什么是装饰器?2. 装饰器的基本语法3. 装饰器的工作原理4. 常见装饰器应用场景4.1. 日志记录4.2. 权限校验4.3. 缓存 5. 多重装饰器的执行顺序6. 装饰器的高级用法6.1. 带参数的装饰器6.2. 使用 functools.wraps6.3. 类装饰器 7. 图示说明7.1. 单…...
Vue使用qrcodejs2-fix生成网页二维码
安装qrcodejs2-fix npm install qrcodejs2-fix核心代码 在指定父view中生成一个二维码通过id找到父布局 //通过id找到父布局let codeView document.getElementById("qrcode")new QRCode(codeView, {text: "测试",width: 128,height: 128,colorDark: #00…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
