Dalsa 8K彩色相机Camera link C#采图

在这里插入图片描述
一个采图工具,所以界面做的很简单。

private SapAcquisition m_Acquisition;
 private SapBuffer m_Buffers;
 private SapAcqToBuf m_Xfer;
 private SapView m_View;
 private SapColorConversion m_ColorConv;
 private SapProcessing m_Pro;
 private SapLocation m_ServerLocation;
 private String m_ConfigFileName;
 private String m_Executetime;
 private bool m_IsSignalDetected;
 private bool m_online;<br>
 public bool CreateNewObjects()
 {
     m_ServerLocation = new SapLocation("Xtium-CL_MX4_1", 2);//第一位是显卡名称,第二位是选择模式的第几项
     m_ConfigFileName = "22N_No_Name_Default_Default.ccf";//配置文件路径
     m_Acquisition = new SapAcquisition(m_ServerLocation, m_ConfigFileName);
     if (SapBuffer.IsBufferTypeSupported(m_ServerLocation, SapBuffer.MemoryType.ScatterGather))
         m_Buffers = new SapBufferWithTrash(2, m_Acquisition, SapBuffer.MemoryType.ScatterGather);
     else
         m_Buffers = new SapBufferWithTrash(2, m_Acquisition, SapBuffer.MemoryType.ScatterGatherPhysical);
     m_Xfer = new SapAcqToBuf(m_Acquisition, m_Buffers);
     m_ColorConv = new SapColorConversion(m_Acquisition, m_Buffers);
     m_Xfer.Pairs[0].EventType = SapXferPair.XferEventType.EndOfFrame;
 
     m_Xfer.XferNotify += new SapXferNotifyHandler(xfer_XferNotify);
     m_Xfer.XferNotifyContext = this;
 
     m_Pro = new SapMyProcessing(m_Buffers, m_ColorConv, new SapProcessingDoneHandler(ProCallback), this);
 
 
 
     if (!CreateObjects())
     {
         DestroyObjects();
         DisposeObjects();
 
         return false;
     }
     EnableSignalStatus();
     return true;
 }
 
//这项函数官方demo是用来显示帧率的,但是我这里不需要所以就没写功能,但是要加这个函数,否则连续采集的时候就只会拍两张照片。
 static void ProCallback(object sender, SapProcessingDoneEventArgs pInfo)
 {
     Form1 demo = pInfo.Context as Form1;
 
 }
 private bool CreateObjects()
 {
     // Create acquisition object
     if (m_Acquisition != null && !m_Acquisition.Initialized)
     {
         if (m_Acquisition.Create() == false)
         {
             DestroyObjects();
             return false;
         }
     }
     // Create buffer object
     if (m_Buffers != null && !m_Buffers.Initialized)
     {
         if (m_Buffers.Create() == false)
         {
             DestroyObjects();
             return false;
         }
         m_Buffers.Clear();
     }
 
     // Create color conversion object
     if (m_ColorConv != null && !m_ColorConv.Initialized)
     {
         if (m_ColorConv.Create() == false)
         {
             DestroyObjects();
             return false;
         }
     }
 
     // Create view object
     if (m_View != null && !m_View.Initialized)
     {
         if (m_ColorConv != null && m_ColorConv.Initialized)
         {
             // Set buffer to be viewed
             // When using hardware color decoder, view the acquired RGB buffer,
             // otherwise, for software color conversion, view the converted RGB buffer.
             SapBuffer convBuffer = m_ColorConv.OutputBuffer;
             if (convBuffer != null && convBuffer.Initialized)
                 m_View.Buffer = convBuffer;
             else
                 m_View.Buffer = m_Buffers;
         }
 
         if (m_View.Create() == false)
         {
             DestroyObjects();
             return false;
         }
     }
     // Create Xfer object
     if (m_Xfer != null && !m_Xfer.Initialized)
     {
         if (m_Xfer.Create() == false)
         {
             DestroyObjects();
             return false;
         }
         m_Xfer.AutoEmpty = false;
     }
 
     // Create processing object
     if (m_Pro != null && !m_Pro.Initialized)
     {
         if (!m_Pro.Create())
         {
             DestroyObjects();
             return false;
         }
 
         m_Pro.AutoEmpty = true;
     }
     return true;
 
 }
 private void DestroyObjects()
 {
     if (m_Xfer != null && m_Xfer.Initialized)
         m_Xfer.Destroy();
     if (m_Pro != null && m_Pro.Initialized)
         m_Pro.Destroy();
     if (m_View != null && m_View.Initialized)
         m_View.Destroy();
     if (m_ColorConv != null && m_ColorConv.Initialized)
         m_ColorConv.Destroy();
     if (m_Buffers != null && m_Buffers.Initialized)
         m_Buffers.Destroy();
     if (m_Acquisition != null && m_Acquisition.Initialized)
         m_Acquisition.Destroy();
 }
 private void DisposeObjects()
 {
     if (m_Xfer != null)
     { m_Xfer.Dispose(); m_Xfer = null; }
     if (m_Pro != null)
     { m_Pro.Dispose(); m_Pro = null; }
     if (m_View != null)
     { m_View.Dispose(); m_View = null; }
     if (m_ColorConv != null)
     { m_ColorConv.Dispose(); m_ColorConv = null; }
     if (m_Buffers != null)
     { m_Buffers.Dispose(); m_Buffers = null; }
     if (m_Acquisition != null)
     { m_Acquisition.Dispose(); m_Acquisition = null; }
 }
 private void EnableSignalStatus()
 {
     if (m_Acquisition != null)
     {
         m_IsSignalDetected = (m_Acquisition.SignalStatus != SapAcquisition.AcqSignalStatus.None);
         // if (m_IsSignalDetected == false)
         //  StatusLabelInfo.Text = "Online... No camera signal detected";
         //  else
         //   StatusLabelInfo.Text = "Online... Camera signal detected";
         m_Acquisition.SignalNotifyEnable = true;
 
     }
 }
 
 
 static void xfer_XferNotify(object sender, SapXferNotifyEventArgs argsNotify)
 {
     Form1 demo = argsNotify.Context as Form1;
     // If grabbing in trash buffer, do not display the image, update the
     // appropriate number of frames on the status bar instead
     if (argsNotify.Trash)
         return;
     // Refresh view
     else
     {
         demo.TakeImage();
         demo.m_Pro.ExecuteNext();
     }
 }
private void button1_Click(object sender, EventArgs e)
{
    m_Xfer.Grab();
}
1
2
3
4
private void button2_Click(object sender, EventArgs e)
{
    m_Xfer.Freeze();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void TakeImage()
   {
       try
       {
           SapBuffer m_pBuffer;
           int m_StartFrame;
        //   SapBuffer.FileFormat[] m_StandardTypes;
           m_pBuffer = m_Buffers;
           m_StartFrame = m_pBuffer.Index; string m_Option = "-format jpeg -quality 30";
           m_Buffers.Save(textBox2.Text, m_Option, m_StartFrame,0);
       }
       catch (Exception ex)
       {
           MessageBox.Show(ex.Message.ToString());
       }
   }

关于采图,上面用的是官方的SDK方式,因为c#教程我采集的图片像素是8K*8K,原图BMP格式有256MB,压缩成30%质量的JPG也还有2.3MB左右。

还有一种方式是用Bitmap来获取图片地址,但是需要注意的一点。

1
2
3
4
5
6
IntPtr addr;
int Height = m_Buffers.Height;
int Width = m_Buffers.Width;
m_Buffers.GetAddress(out addr);      
bitmap = new Bitmap(Width, Height, Width * 4, System.Drawing.Imaging.PixelFormat.Format32bppRgb, addr);
                    

这里的宽度是*4,原因是我的BMPpython基础教程原图图像位深度是32位的。所以保存用Bitmap的方式需要先确定原图的位深度,否则保存图片会出现重影。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: dalsa线扫相机是一种高速、高分辨率的相机,适用于工业生产线上的自动化检测和质量控制。它采用了camera link接口,可以实现高速数据传输和实时图像处理。dalsa线扫相机具有高灵敏度、低噪声、高动态范围等优点,可以满足各种复杂的应用需求。 ### 回答2: Dalsa线扫相机是一种常用于工业生产线上的高速图像采集设备,可以对物体进行高速、高精度的图像捕捉。而Camera Link技术则是一种快速、可靠、高性能的数字接口技术,可以支持高速数据传输及控制信号传输。因此,Dalsa线扫相机Camera Link技术的结合,可以实现更快、更稳定的图像采集与传输。 Dalsa线扫相机与其他相机不同之处在于,它们采取单行CCD或CMOS传感器,其工作原理是将物体视作纵向运动的一系列图像,通过高速采样融合成一幅完整的图像。而Camera Link技术是将传输的数据分为三部分:Base、Medium、Full,其中Base为最慢的速度,Medium为中速,Full为最快的速度,用户可以根据实际需求来选择数据传输速度,同时Camera Link也可以通过设备与卡的匹配来保证通信质量。 Dalsa线扫相机Camera Link支持高达16位的数据传输,能够以每秒几千线或几万线的速度捕捉物体,其精度与速度均可满足工业生产线上的要求。除此之外,Dalsa线扫相机还具有可调节的曝光时间、增益、信噪比等多种参数,用户可以根据需要进行调整,从而得到更加清晰、准确的图像。 总之,Dalsa线扫相机Camera Link具有高速、高精度、高可靠性等特点,可以广泛应用于自动化生产线上。它们可以提高生产效率、减少人工操作、降低成本,同时也可以对产品质量进行实时监测与控制。 ### 回答3: Dalsa线扫相机Camera Link是一种高性能的数字化相机系统,可以实现快速、稳定、高分辨率的图像采集和处理。相对于传统模拟相机,它具有数字化信号传输、高质量、高精度、长时间稳定等优点。 Dalsa线扫相机Camera Link使用专业的线性传感器,可以实现高精度的图像采集和处理,常用于工业生产过程中对产品质量、尺寸等进行严格监控。常用于带有高速移动的物体的图像拍摄,如传输带上的产品、飞机起降轨迹等等。同时,它被广泛应用于机器视觉、自动化生产、医疗设备、半导体制造等各个领域。 Camera Link作为一种高性能的数字化系统,它具有高速传输、高质量图像采集、低噪声、高灵敏度等优点。同时,它还可以实现不同分辨率的图像采集,满足不同应用需求。相应的,Camera Link的价格也会随着分辨率的提高而增加。 总之,Dalsa线扫相机Camera Link已经成为工业生产和机器视觉中不可或缺的关键元素,能够帮助企业提高产品质量和生产效率,确保工业生产、医疗设备和半导体制造等各个领域的稳定发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值