MVS4.4 Samples C# MvCameraControlNet_V2 Grab_Callback取图Bmp

 新建Winform 应用类型选择命令行 因为会自动添加

using System.Drawing;
using System.Drawing.Imaging;

的引用避免手动添加 其实是懒得;

其实之前写过一篇类似的 但是那个是旧版本 新版本据说是事件,调试半天我没仔细看

贴出官方README.txt

工业相机SDK提供了两套.Net接口,命名空间分别为:
1. namespace MvCamCtrl.NET:	示例程序位于 MvCameraControlNet 文件夹下。
2. namespace MvCameraControl:	示例程序位于 MvCameraControlNet_V2 文件夹下。推荐使用 namespace MvCameraControl 的接口namespace MvCamCtrl.NET:
1. 基于 .Net Framework 3.5 开发,演示如何将SDK的C语言接口封装成.Net接口,再调用封装的.Net接口实现SDK功能
2. 源码位于 MvCameraControlNet\MVCameraSDK\Source\MVCamera.csnamespace MvCameraControl:
1. 基于 .Net Framework 4.0 开发,是SDK提供的新的.Net程序集(MvCameraControl.Net.dll)
2. 库文件位于客户端安装路径下的 Development\DotNet\AnyCpu\MvCameraControl.Net.dll,同时提供了win32 和 win64版本
3. 具体的调用方法可参考文档目录下的工业相机SDK开发指南(.Net)
using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using MvCameraControl;using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Xml.Linq;using HalconDotNet;namespace MVS44V2
{public partial class Form1 : Form{public Form1(){Runn();InitializeComponent();}private void InitializeComponent(){this.SuspendLayout();// // Form1// this.ClientSize = new System.Drawing.Size(725, 465);this.Name = "Form1";this.ResumeLayout(false);}const DeviceTLayerType devLayerType = DeviceTLayerType.MvGigEDevice | DeviceTLayerType.MvUsbDevice | DeviceTLayerType.MvGenTLCameraLinkDevice| DeviceTLayerType.MvGenTLCXPDevice | DeviceTLayerType.MvGenTLXoFDevice;public static void SaveBmp(int width, int height, int stride, byte[] imageData, string fileName, MvGvspPixelType pixelType){// 创建 Bitmap 对象Bitmap bitmap = null;if (pixelType == MvGvspPixelType.PixelType_Gvsp_Mono8){// 灰度图bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);}else{// RGB 图bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);}// 锁定 Bitmap 数据Rectangle rect = new Rectangle(0, 0, width, height);BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, bitmap.PixelFormat);// 将图像数据复制到 Bitmapif (pixelType == MvGvspPixelType.PixelType_Gvsp_Mono8){// 灰度图需要设置调色板ColorPalette palette = bitmap.Palette;for (int i = 0; i < 256; i++){palette.Entries[i] = Color.FromArgb(i, i, i);}bitmap.Palette = palette;// 灰度图数据直接复制Marshal.Copy(imageData, 0, bitmapData.Scan0, imageData.Length);}else{// RGB 图数据直接复制Marshal.Copy(imageData, 0, bitmapData.Scan0, imageData.Length);}// 解锁 Bitmap 数据bitmap.UnlockBits(bitmapData);// 保存为 BMP 文件bitmap.Save(fileName, ImageFormat.Bmp);// 释放资源bitmap.Dispose();}// 只能 RGB图 灰度图 需要设置调色板public static void SaveBmp(int width, int height, int stride, byte[] imageData, string fileName){// 创建 Bitmap 对象Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);// 锁定 Bitmap 数据Rectangle rect = new Rectangle(0, 0, width, height);BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);// 将图像数据复制到 BitmapMarshal.Copy(imageData, 0, bitmapData.Scan0, imageData.Length);// 解锁 Bitmap 数据bitmap.UnlockBits(bitmapData);// 保存为 BMP 文件bitmap.Save(fileName, ImageFormat.Bmp);}public static Bitmap GetBmp(int width, int height, int stride, byte[] imageData, MvGvspPixelType pixelType){// 创建 Bitmap 对象Bitmap bitmap = null;if (pixelType == MvGvspPixelType.PixelType_Gvsp_Mono8){// 灰度图bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);}else{// RGB 图bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);}// 锁定 Bitmap 数据Rectangle rect = new Rectangle(0, 0, width, height);BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, bitmap.PixelFormat);// 处理图像数据if (pixelType == MvGvspPixelType.PixelType_Gvsp_Mono8){// 设置调色板ColorPalette palette = bitmap.Palette;for (int i = 0; i < 256; i++){palette.Entries[i] = Color.FromArgb(i, i, i);}bitmap.Palette = palette;// 复制灰度图数据Marshal.Copy(imageData, 0, bitmapData.Scan0, imageData.Length);}else{// 复制 RGB 数据Marshal.Copy(imageData, 0, bitmapData.Scan0, imageData.Length);}// 解锁 Bitmap 数据bitmap.UnlockBits(bitmapData);return bitmap;}public static HTuple ByteToHTuple(byte[] byteArray){var tuple = new HTuple(byteArray.Length);for (int i = 0; i < byteArray.Length; i++){tuple[i] = byteArray[i];}return tuple;}static void FrameGrabedEventHandler(object sender, FrameGrabbedEventArgs e){Console.WriteLine($@"                 | 灰度图                 | 彩色图{e.FrameOut.Image.Width}          | 1280                   | 1280{e.FrameOut.Image.Height}         | 1024                   | 1024{e.FrameOut.Image.ImageSize}      | 1310720                | 3932160{e.FrameOut.FrameNum}             | 58                     | 3{e.FrameOut.Image.PixelData}      | System.Byte[]          | System.Byte[]{e.FrameOut.Image.PixelDataPtr}   | 549359688              | 538144840{e.FrameOut.Image.PixelType}      | PixelType_Gvsp_Mono8   | PixelType_Gvsp_RGB8_Packed");int width = (int)e.FrameOut.Image.Width;int height = (int)e.FrameOut.Image.Height;IntPtr pixelData = e.FrameOut.Image.PixelDataPtr; // 托管指针int imageSize = (int)e.FrameOut.Image.ImageSize;int stride = width; // 每行字节数等于宽度 // 假设像素格式是 GrayScale (Mono8)if (e.FrameOut.Image.PixelType == MvGvspPixelType.PixelType_Gvsp_RGB8_Packed){stride = width * 3; // RGB 图像,每像素 3 字节}else if (e.FrameOut.Image.PixelType == MvGvspPixelType.PixelType_Gvsp_Mono8){stride = width; // 灰度图,每像素 1 字节}//stride = width * (e.FrameOut.Image.PixelType == MvGvspPixelType.PixelType_Gvsp_Mono8 ? 1 : 3);// 计算宽度和字节数// 将托管指针转换为字节数组byte[] imageData = new byte[imageSize];Marshal.Copy(pixelData, imageData, 0, imageSize);DateTime now = DateTime.Now;// 提取年、月、日、时、分、秒、毫秒string year = now.Year.ToString();string month = now.Month.ToString("D2"); // 补零,保证两位数string day = now.Day.ToString("D2");string hour = now.Hour.ToString("D2");string minute = now.Minute.ToString("D2");string second = now.Second.ToString("D2");string millisecond = now.Millisecond.ToString("D6"); // 毫秒string folderPath = $@"{year}{month}{day}{hour}{minute}{second}{millisecond}";if (!Directory.Exists($@"{Environment.CurrentDirectory}\Image")){Directory.CreateDirectory($@"{Environment.CurrentDirectory}\Image");}if (!Directory.Exists($@"{Environment.CurrentDirectory}\HAImage")){Directory.CreateDirectory($@"{Environment.CurrentDirectory}\HAImage");}if (e.FrameOut.Image.PixelType == MvGvspPixelType.PixelType_Gvsp_RGB8_Packed){// SaveBmp(width, height, stride, imageData, "output_rgb.bmp", MvGvspPixelType.PixelType_Gvsp_RGB8_Packed);  //保存//   Bitmap rgbBitmap = GetBmp(width, height, stride, imageData, MvGvspPixelType.PixelType_Gvsp_RGB8_Packed); // 转bmpBitmap rgbBitmap = GetBmp(width, height, stride, e.FrameOut.Image.PixelData, MvGvspPixelType.PixelType_Gvsp_RGB8_Packed); //转 bmprgbBitmap.Save($@"{Environment.CurrentDirectory}\Image\{folderPath}rgb.bmp");}else if (e.FrameOut.Image.PixelType == MvGvspPixelType.PixelType_Gvsp_Mono8){//   SaveBmp(width, height, stride, imageData, "output_gray.bmp", MvGvspPixelType.PixelType_Gvsp_Mono8); //保存Bitmap grayBitmap = GetBmp(width, height, stride, imageData, MvGvspPixelType.PixelType_Gvsp_Mono8); //转bmpgrayBitmap.Save($@"{Environment.CurrentDirectory}\Image\{folderPath}gray.bmp");}//   HOperatorSet.WriteImage(halconImage, "bmp",0,$@"{Environment.CurrentDirectory}\HAImage\{folderPath}gray.bmp");string currentDirectory = Environment.CurrentDirectory;Console.WriteLine("当前工作目录: " + currentDirectory);// 构建文件夹路径//  string folderPath = Path.Combine(year, month, day);}static void Runn(){// ch: 初始化 SDK | en: Initialize SDKSDKSystem.Initialize();IDevice device = null;try{List<IDeviceInfo> devInfoList;// ch:枚举设备 | en:Enum deviceint ret = DeviceEnumerator.EnumDevices(devLayerType, out devInfoList);if (ret != MvError.MV_OK){Console.WriteLine("Enum device failed:{0:x8}", ret);return;}Console.WriteLine("Enum device count : {0}", devInfoList.Count);if (0 == devInfoList.Count){return;}// ch:打印设备信息 en:Print device infoint devIndex = 0;foreach (var devInfo in devInfoList){Console.WriteLine("[Device {0}]:", devIndex);if (devInfo.TLayerType == DeviceTLayerType.MvGigEDevice || devInfo.TLayerType == DeviceTLayerType.MvVirGigEDevice || devInfo.TLayerType == DeviceTLayerType.MvGenTLGigEDevice){IGigEDeviceInfo gigeDevInfo = devInfo as IGigEDeviceInfo;uint nIp1 = ((gigeDevInfo.CurrentIp & 0xff000000) >> 24);uint nIp2 = ((gigeDevInfo.CurrentIp & 0x00ff0000) >> 16);uint nIp3 = ((gigeDevInfo.CurrentIp & 0x0000ff00) >> 8);uint nIp4 = (gigeDevInfo.CurrentIp & 0x000000ff);Console.WriteLine("DevIP: {0}.{1}.{2}.{3}", nIp1, nIp2, nIp3, nIp4);}Console.WriteLine("ModelName:" + devInfo.ModelName);Console.WriteLine("SerialNumber:" + devInfo.SerialNumber);Console.WriteLine();devIndex++;}Console.Write("Please input index(0-{0:d}):", devInfoList.Count - 1);devIndex = Convert.ToInt32(Console.ReadLine());if (devIndex > devInfoList.Count - 1 || devIndex < 0){Console.Write("Input Error!\n");return;}// ch:创建设备 | en:Create devicedevice = DeviceFactory.CreateDevice(devInfoList[devIndex]);ret = device.Open();if (ret != MvError.MV_OK){Console.WriteLine("Open device failed:{0:x8}", ret);return;}// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)if (device is IGigEDevice){int packetSize;ret = (device as IGigEDevice).GetOptimalPacketSize(out packetSize);if (packetSize > 0){ret = device.Parameters.SetIntValue("GevSCPSPacketSize", packetSize);if (ret != MvError.MV_OK){Console.WriteLine("Warning: Set Packet Size failed {0:x8}", ret);}else{Console.WriteLine("Set PacketSize to {0}", packetSize);}}else{Console.WriteLine("Warning: Get Packet Size failed {0:x8}", ret);}}// ch:设置触发模式为off || en:set trigger mode as offret = device.Parameters.SetEnumValue("TriggerMode", 0);if (ret != MvError.MV_OK){Console.WriteLine("Set TriggerMode failed:{0:x8}", ret);return;}//ch: 设置合适的缓存节点数量 | en: Setting the appropriate number of image nodesdevice.StreamGrabber.SetImageNodeNum(5);// ch:注册回调函数 | en:Register image callbackdevice.StreamGrabber.FrameGrabedEvent += FrameGrabedEventHandler;// ch:开启抓图 || en: start grab imageret = device.StreamGrabber.StartGrabbing();if (ret != MvError.MV_OK){Console.WriteLine("Start grabbing failed:{0:x8}", ret);return;}Console.WriteLine("Press enter to exit");Console.ReadLine();// ch:停止抓图 | en:Stop grabbingret = device.StreamGrabber.StopGrabbing();if (ret != MvError.MV_OK){Console.WriteLine("Stop grabbing failed:{0:x8}", ret);return;}// ch:关闭设备 | en:Close deviceret = device.Close();if (ret != MvError.MV_OK){Console.WriteLine("Close device failed:{0:x8}", ret);return;}// ch:销毁设备 | en:Destroy devicedevice.Dispose();device = null;}catch (Exception e){Console.Write("Exception: " + e.Message);}finally{// ch:销毁设备 | en:Destroy deviceif (device != null){device.Dispose();device = null;}// ch: 反初始化SDK | en: Finalize SDKSDKSystem.Finalize();Console.WriteLine("Press enter to exit");Console.ReadKey();}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具&#xff0c;便于在客户端软件中…

一、OpenGL的原理解析

文章目录 OpenGL到底实现的是什么&#xff1f;OpenGL内模型数据的本质是什么&#xff1f;为什么三角形是 3D 渲染的最基本单元&#xff1f;MVP 变换&#xff08;Model-View-Projection 变换&#xff09;OpenGL渲染流程-摄像机变换OpenGL渲染流程-投影变换OpenGL渲染管线概述 Op…

大模型——CogView4:生成中英双语高清图片的开源文生图模型综合介绍

CogView4:生成中英双语高清图片的开源文生图模型综合介绍 CogView4 是由清华大学 KEG 实验室(THUDM)开发的一款开源文生图模型,专注于将文本描述转化为高质量图像。它支持中英双语提示词输入,尤其擅长理解中文提示并生成带有汉字的图像,非常适合广告设计、短视频创作等场…

网络安全法与等级保护 PPT 精华汇总

资源描述 本资源文件为《网络安全法与等级保护》的PPT精华汇总&#xff0c;内容涵盖了网络安全法与等级保护的总体框架及相关标准规范。该PPT详细介绍了网络安全法与等级保护的各个章节和条款&#xff0c;并提供了基础类和应用类的相关标准文件&#xff0c;帮助读者全面了解和…

前端知识一

&#xff08;ref函数&#xff09;1.为什么vue3中使用ref来创建响应式数据&#xff0c;而不是直接声明一个变量 import { ref } from "vue";const count ref(0); // 创建一个响应式的计数器&#xff0c;初始值为0function increment() {count.value; // 增加计数器的…

国产免费AI的IDE-TRAE

还是在AI的加持下的新的工具 在上周一次偶然的机会看到了这样的标题–用上Claude的AI编程工具Trae。 AI我还没入门&#xff0c;编程也是小白级别。Claude是什么不知道。Trae这是什么也不知道。为什么起这个名字&#xff1f;都不知道含义。 先下载吧。&#xff08;这里要说一…

解决中文乱码:字符编码全攻略 - ASCII、Unicode、UTF-8、GB2312详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【Linux】进程信号——信号保存和信号捕捉

文章目录 信号保存信号相关的概念信号是如何保存的呢&#xff1f;有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达&#xff1a;指 操作系统 将一个信号&#xff08;Signal…

计算机网络数据传输探秘:包裹如何在数字世界旅行?

计算机网络数据传输探秘:包裹如何在数字世界旅行? 一、从快递网络看数据传输本质 想象你网购了一件商品: 打包:商家用纸箱包装,贴上地址标签(数据封装)运输:包裹经过网点→分拣中心→运输车(网络节点与链路)签收:快递员核对信息后交付(数据校验与接收)数据的网络…

CyberRT(apollo) 定时器模块简述及bug分析

timer 模块 timer的定义&#xff0c;cyberrt中timer模块用于设置定时器任务&#xff0c;字面意思&#xff0c;设置设置定时周期及出发频次&#xff08;周期 or oneshot)&#xff0c;到达指定时间时间触发callback time wheel 时钟节拍轮&#xff0c;常见的定时器设计&#x…

使用ast获取py文件中所有函数与类名

当我们在创建python项目,经常需要遍历和分析代码文件&#xff0c;特别是当我们想要自动化地获取某些信息&#xff0c;比如所有的函数和类名。Python的ast&#xff08;Abstract Syntax Trees&#xff0c;抽象语法树&#xff09;模块为我们提供了一个强大的工具&#xff0c;可以方…

【C语言5】函数:库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、声明和定义

文章目录 一、函数的概念二、库函数2.1 标准库和头文件2.2 库函数的使用方法 三、自定义函数3.1 函数的语法形式 四、形参和实参4.1 实参4.2 形参4.2 实参和形参的关系 五、return 语句六、数组做函数参数七、嵌套调用和链式访问7.1 嵌套调用7.2 链式访问 八、函数的声明和定义…

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…

vscode 都有哪些大模型编程插件

VSCode 中有许多基于大模型的编程插件&#xff0c;这些插件通过集成人工智能技术&#xff0c;显著提升了开发者的编程效率和体验。以下是一些主要的大模型编程插件及其功能&#xff1a; GitHub Copilot GitHub Copilot 是由 OpenAI 开发的插件&#xff0c;能够根据代码上下文自…

每日一题洛谷普及/提高-P1154 奶牛分厩c++

无注释版 #include<iostream> #include<cstring> #include<cstdlib> using namespace std; bool ju(int n, int s[], int len, bool a[]) {memset(a, 0, n * sizeof(bool));for (int j 0; j < len; j) {if (a[s[j] % n]) {return false;}a[s[j] % n] t…

[liorf_localization_imuPreintegration-2] process has died

使用liorf&#xff0c;编译没报错&#xff0c;但是roslaunch报错如下&#xff1a; 解决方法&#xff1a; step1: 如果你之前没有安装 GTSAM&#xff0c;可以尝试安装它 step2: 检查是否缺少依赖库 ldd /home/zz/1210/devel/lib/liorf_localization/liorf_localization_imuPr…

Jmeter+ant+jenkins接口自动化测试

平台简介 一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter 支持接口的测试&#xff0c;Ant 支持自动构建&#xff0c;而 Jenkins 支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动…

springboot425-基于SpringBoot的BUG管理系统(源码+数据库+纯前后端分离+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

leetcode 148. 排序链表

题目如下 数据范围 通过代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : va…