技术标签: C# winfrom

添加ThridLibray.dll,halcondotnet.dll 引用即可
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ThridLibray;
namespace FormFrame.SDK
{
public struct Camera
{
public string Name;
public string Key;
public string Model;
public int Index;
}
public class DaHuaSDK
{
private IDevice m_dev;
private List<IGrabbedRawData> m_frameList = new List<IGrabbedRawData>(); /* 图像缓存列表 */
private Thread renderThread = null; /* 显示线程 */
private bool m_bShowLoop = true; /* 线程控制变量 */
private Mutex m_mutex = new Mutex(); /* 锁,保证多线程安全 */
private const int DEFAULT_INTERVAL = 40;
private Stopwatch m_stopWatch = new Stopwatch(); /* 时间统计器 */
private HObject ho_image;
/// <summary>
/// 图像处理自定义委托
/// </summary>
/// <param name="HImage">halcon图像变量</param>
public delegate void delegateProcessHImage( HObject hImage );
/// <summary>
/// 图像处理委托事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public event delegateProcessHImage eventProcessImage;
public delegate void delegateError( string message );
public delegate void delegateInfo( string message );
public event delegateError Eventerror;//错误
public event delegateError Eventinfo;//提示
/// <summary>
/// 获取相机列表
/// </summary>
/// <returns></returns>
public List<Camera> CameraList()
{
List<Camera> cameraList = new List<Camera>();
List<IDeviceInfo> li = Enumerator.EnumerateDevices();
for ( int i = 0; i < li.Count; i++ )
{
cameraList.Add( new Camera() { Key = li[i].Key, Name = li[i].Name, Model = li[i].Model, Index = li[i].Index } );
}
return cameraList;
}
/// <summary>
/// 相机名称
/// </summary>
public string Name;
/// <summary>
/// 初始化相机
/// </summary>
/// <param name="cameraName"></param>
public DaHuaSDK( string cameraName )
{
List<IDeviceInfo> li = Enumerator.EnumerateDevices();
bool flag = false;
for ( int i = 0; i < li.Count; i++ )
{
if ( li[i].Name == cameraName )
{
if ( Eventinfo != null )
{
Eventinfo( DateTime.Now.ToString() + " 已找到相机。" );
}
m_dev = Enumerator.GetDeviceByIndex( i );
Name = cameraName;
flag = true;
break;
}
}
if ( !flag )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " 未找到相机!" );
}
throw new Exception( DateTime.Now.ToString() + " 未找到相机!" );
}
}
/// <summary>
/// 打开相机
/// </summary>
/// <returns></returns>
public bool Open()
{
bool state = m_dev.Open();
if ( state )
{
if ( Eventinfo != null )
{
Eventinfo( DateTime.Now.ToString() + " 相机已打开。" );
}
m_dev.CameraOpened += OnCameraOpen;
m_dev.ConnectionLost += OnConnectLoss;
m_dev.CameraClosed += OnCameraClose;
/* 打开Software Trigger */
m_dev.TriggerSet.Open( TriggerSourceEnum.Software );
using ( IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImagePixelFormat] )
{
p.SetValue( "Mono8" );
}
/* 设置缓存个数为8(默认值为16) */
m_dev.StreamGrabber.SetBufferCount( 8 );
/* ***流回调事件 */
m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
renderThread = new Thread( new ThreadStart( ShowThread ) ) { IsBackground = true };
renderThread.Start();
/* 开启码流 */
if ( !m_dev.GrabUsingGrabLoopThread() )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " 流码开启失败。" );
}
return false;
}
if ( Eventinfo != null )
{
Eventinfo( DateTime.Now.ToString() + " 流码已开启。" );
}
}
return state;
}
/// <summary>
/// 关闭相机
/// </summary>
/// <returns></returns>
public bool Close()
{
try
{
if ( m_dev != null )
{
m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; /* 反注册回调 */
m_dev.ShutdownGrab(); /* 停止码流 */
m_dev.Close(); /* 关闭相机 */
if ( Eventinfo != null )
{
Eventinfo( DateTime.Now.ToString() + " 相机关闭成功。" );
}
return m_dev.Close();
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return true;
}
/// <summary>
/// 相机状态
/// </summary>
/// <returns></returns>
public bool IsOpen()
{
return m_dev.IsOpen;
}
private bool isTimeToDisplay()
{
m_stopWatch.Stop();
long m_lDisplayInterval = m_stopWatch.ElapsedMilliseconds;
if ( m_lDisplayInterval <= DEFAULT_INTERVAL )
{
m_stopWatch.Start();
return false;
}
else
{
m_stopWatch.Reset();
m_stopWatch.Start();
return true;
}
}
private void ShowThread()
{
while ( m_bShowLoop )
{
if ( m_frameList.Count == 0 )
{
Thread.Sleep( 10 );
continue;
}
/* 图像队列取最新帧 */
m_mutex.WaitOne();
IGrabbedRawData frame = m_frameList.ElementAt(m_frameList.Count - 1);
m_frameList.Clear();
m_mutex.ReleaseMutex();
/* 主动调用回收垃圾 */
GC.Collect();
/* 控制显示最高帧率为25FPS */
if ( false == isTimeToDisplay() )
{
continue;
}
try
{
/* 图像转码成bitmap图像 */
var bitmap = frame.ToBitmap(false);
BitmapToHImage( bitmap );
if ( eventProcessImage != null )
{
eventProcessImage( ho_image );
}
}
catch ( Exception exception )
{
Catcher.Show( exception );
}
}
}
/// <summary>
/// Bitmap格式图片转Hobject格式
/// </summary>
/// <param name="SrcImage"></param>
/// <returns></returns>
private HObject BitmapToHImage( Bitmap SrcImage )
{
HOperatorSet.GenEmptyObj( out ho_image );
Point po = new Point(0, 0);
Size so = new Size(SrcImage.Width, SrcImage.Height);//template.Width, template.Height
Rectangle ro = new Rectangle(po, so);
Bitmap DstImage = new Bitmap(SrcImage.Width, SrcImage.Height, PixelFormat.Format8bppIndexed);
DstImage = SrcImage.Clone( ro, PixelFormat.Format8bppIndexed );
int width = DstImage.Width;
int height = DstImage.Height;
Rectangle rect = new Rectangle(0, 0, width, height);
System.Drawing.Imaging.BitmapData dstBmpData =
DstImage.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);//pImage.PixelFormat
int PixelSize = Bitmap.GetPixelFormatSize(dstBmpData.PixelFormat) / 8;
int stride = dstBmpData.Stride;
unsafe
{
int count = height * width;
byte[] data = new byte[count];
byte* bptr = (byte*)dstBmpData.Scan0;
fixed ( byte* pData = data )
{
for ( int i = 0; i < height; i++ )
for ( int j = 0; j < width; j++ )
{
data[i * width + j] = bptr[i * stride + j];
}
HOperatorSet.GenImage1( out ho_image, "byte", width, height, new IntPtr( pData ) );
}
}
DstImage.UnlockBits( dstBmpData );
return ho_image;
}
/// <summary>
/// Bitmap格式图片转Hobject格式
/// </summary>
/// <param name="SrcImage"></param>
/// <returns></returns>
public HObject Bitmap2Hobject( Bitmap bitmap )
{
Rectangle rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData bitmapData = bitmap.LockBits(rectangle, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
IntPtr intPtr = bitmapData.Scan0;
HOperatorSet.GenEmptyObj( out ho_image );
HOperatorSet.GenEmptyObj( out ho_image );
ho_image.Dispose();
HOperatorSet.GenImageInterleaved( out ho_image, intPtr, "bgrx", bitmap.Width, bitmap.Height, -1, "byte", 0, 0, 0, 0, -1, 0 );
bitmap.UnlockBits( bitmapData );
return ho_image;
}
/// <summary>
/// 设置曝光时间
/// </summary>
/// <param name="value"></param>
public void SetExposureTime( int value )
{
try
{
using ( IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime] )
{
p.SetValue( value );
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
}
/// <summary>
/// 获取当前相机曝光值
/// </summary>
/// <returns></returns>
public double GetExposureTime()
{
try
{
using ( IFloatParameter p = m_dev.ParameterCollection[new FloatName( "ExposureTime" )] )
{
return p.GetValue();
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return 0;
}
/// <summary>
/// 获取所有像素格式
/// </summary>
/// <returns></returns>
public List<string> GetAllPixelFormatList()
{
try
{
using ( IEnumParameter p = m_dev.ParameterCollection[new EnumName( "PixelFormat" )] )
{
Trace.WriteLine( string.Format( "PixelFormat value: {0}", p.GetValue() ) );
List<string> list = new List<string>();
list = p.GetAllValues();
return list;
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return new List<string>();
}
/// <summary>
/// 获取当前像素格式
/// </summary>
/// <returns></returns>
public string GetPixelFormat()
{
try
{
using ( IEnumParameter p = m_dev.ParameterCollection[new EnumName( "PixelFormat" )] )
{
Trace.WriteLine( string.Format( "PixelFormat value: {0}", p.GetValue() ) );
return p.GetValue();
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return "";
}
/// <summary>
/// 设置像素格式
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public bool SetPixelFormat( string value )
{
try
{
using ( IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImagePixelFormat] )
{
return p.SetValue( value );
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return false;
}
/// <summary>
/// 设置增益
/// </summary>
/// <param name="value"></param>
public void SetGainRaw( int value )
{
try
{
using ( IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw] )
{
p.SetValue( (double)value );
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
}
/// <summary>
/// 设置缓存个数为
/// </summary>
public void SetBufferCount( int value )
{
try
{
/* 设置缓存个数为8(默认值为16) */
m_dev.StreamGrabber.SetBufferCount( value );
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
}
/// <summary>
/// 开始连续采集
/// </summary>
/// <returns></returns>
public bool StartCollectCapture()
{
try
{
m_dev.ShutdownGrab();
m_dev.TriggerSet.Close();
return m_dev.GrabUsingGrabLoopThread();
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return false;
}
/// <summary>
/// 停止连续采集
/// </summary>
/// <returns></returns>
public bool StopCollectCapture()
{
try
{
m_dev.ShutdownGrab();
m_dev.TriggerSet.Open( TriggerSourceEnum.Software );
return m_dev.GrabUsingGrabLoopThread();
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return false;
}
/// <summary>
/// 拍摄单张图像
/// </summary>
/// <returns></returns>
public bool GrabImage()
{
try
{
m_dev.TriggerSet.Open( TriggerSourceEnum.Software );
Thread.Sleep( 10 );
bool flag = m_dev.ExecuteSoftwareTrigger();
m_stopWatch.Restart();
return flag;
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
return false;
}
/// <summary>
/// 设置触发模式,0为软触发,1为外触发
/// </summary>
public void TriggerSource( int num )
{
try
{
if ( num == 0 )
{
m_dev.TriggerSet.Open( TriggerSourceEnum.Software );
}
else if ( num == 1 )
{
m_dev.TriggerSet.Open( TriggerSourceEnum.Line1 );
}
}
catch ( Exception e )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + e.Message );
}
}
}
/// <summary>
/// 相机关闭回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnCameraClose( object sender, EventArgs e )
{
}
/// <summary>
/// 相机丢失回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnConnectLoss( object sender, EventArgs e )
{
m_dev.ShutdownGrab();
m_dev.Dispose();
m_dev = null;
System.Windows.Forms.MessageBox.Show( "相机:" + Name + "已掉线,请检查。" );
}
/// <summary>
/// 相机打开回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnCameraOpen( object sender, EventArgs e )
{
}
/// <summary>
/// ***流回调事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnImageGrabbed( object sender, GrabbedEventArgs e )
{
try
{
m_mutex.WaitOne();
m_frameList.Add( e.GrabResult.Clone() );
m_mutex.ReleaseMutex();
}
catch ( Exception ex )
{
if ( Eventerror != null )
{
Eventerror( DateTime.Now.ToString() + " " + ex.Message );
}
}
}
}
}
最近在学习大华NVR的demo 发现在搜索设备这个功能上 demo的局域网搜索也是不行的 最后通过其官网的工具箱抓包 搜索设备的时候主要是广播以下字段 通过socket发包能实现一样的功能 就是设备返回的信息还要解析一下 ...
使用到了Basler的相机,利用C#编写的SDK,下面进行简单的整理记录。 首先引用basler的动态库文件,具体引用位置如下: 安装目录\Basler\pylon 5\Development\Assemblies\Basler.Pylon\x64\Basler.Pylon.dll ————————&m...
FbxWrapper是fbx sdk的c#封装。目的是为了方便fbx工具的开发,同时也可以方便的与Unity集成。代码使用SWIG生成。目前使用fbx 2016 vs2013版本。想要升级到最新的fbx sdk版本应该不会很难。 实现 首先要以正确的顺序include所有的头文件。为此实现了一个小工具IncludeGraph,用于对所有的头文件根据依赖关系进行排序,去除循环依赖。 首先需要引入平台...
话不多说,直接上关键代码! 关键代码一:在初始化相机的时候对相机的像素格式进行判断 关键代码二:灰度图取流回调 关键代码三:RGB图取图回调 ...
话不多说,上关键代码! 关键代码一:https://blog.csdn.net/qq_41653486/article/details/103349208 (接前文链接 回调里的GetImageEvent事件) ...
DHController.java CaptureReceiveCB.java Cache.java DisConnect.java...
目前需引用的文件还在审核中,这边提供有道云的链接提供下载: 文档:c#大华摄像头调用,抓取图片.note 链接:http://note.youdao.com/noteshare?id=1b539df41362d9605d59239c08c16e42&sub=8A046E28B3E0439C8DE0965271ADE159 ...
改变显示之后,想重新打开相机,需要将参数重新导入,imgMaxSize获得参考上一篇。...
先说结论:海康相机在多相机实例时,不需要每个相机都注册回调函数,注册一次,通过回调函数的pUser指针可以获取到是哪个相机的回调。因此单相机或者不封装的朋友反而不会碰到这种错。 我做相机已经习惯性思维了,不管什么牌子相机都是实例化-注册回调-打开-设置UserSet1-开启码流-硬触发/软触发-关流-销毁实例。所以就按照basler的自己开了个类。没想到直接在回调报了个错,说是Invoke类型的已...
一.学习资料 1.官网下载安装MVS软件。 2.文件资料路径:C:\Program Files (x86)\MVS\Development\Documentations 3.引用的DLL路径:C:\Program Files (x86)\Common Files\MVS\Runtime\Win64_x64\MvCameraControl.dll(实测是这个路径,而非官方推荐的C:\Program ...