当前位置: 首页 > news >正文

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();}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React启动时 Error: error:0308010C:digital envelope routines::unsupported
  • 三维手势 handpose 3D RGB 手势3D建模 三维建模-手势舞 >> DataBall
  • C语言 | Leetcode C语言题解之第434题字符串中的单词数
  • 【我的 PWN 学习手札】fastbin reverse into tcache —— tcache key 绕过
  • 科大讯飞智能体Python SDK接入流程
  • 我能禁止使用某协议的ip禁止访问我的资源吗
  • provide 和 inject
  • 容器化安装Jenkins部署devops
  • 基于SpringBoot的在线点餐系统【附源码】
  • 【Unity设计模式】Unity MVC/MVP架构介绍,及MVC/MVP框架的简单应用
  • json格式互相转换
  • [论文笔记] 多语言配比的自动化超参搜索
  • 第三讲 part 2:LINK3D原理 - 代码 - 自定义内容
  • 【VUE】vue-router
  • 在虚幻引擎中实时显示帧率
  • 「面试题」如何实现一个圣杯布局?
  • Apache Pulsar 2.1 重磅发布
  • Docker入门(二) - Dockerfile
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript面向对象之创建对象
  • k8s 面向应用开发者的基础命令
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • pdf文件如何在线转换为jpg图片
  • Spring Cloud Feign的两种使用姿势
  • uva 10370 Above Average
  • 番外篇1:在Windows环境下安装JDK
  • 给新手的新浪微博 SDK 集成教程【一】
  • 小程序开发中的那些坑
  • 小李飞刀:SQL题目刷起来!
  • ​configparser --- 配置文件解析器​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #1014 : Trie树
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (1)Android开发优化---------UI优化
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (5)STL算法之复制
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (回溯) LeetCode 46. 全排列
  • (南京观海微电子)——I3C协议介绍
  • (五)IO流之ByteArrayInput/OutputStream
  • (转)Linux下编译安装log4cxx
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .net mvc部分视图
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @JsonFormat 和 @DateTimeFormat 的区别
  • @RestController注解的使用
  • [000-01-008].第05节:OpenFeign特性-重试机制
  • [AIGC] Kong:一个强大的 API 网关和服务平台