1、SDK介绍

Dalsa是全球顶尖的CCD/CMOS芯片和相机制造商,总部位于加拿大,我使用的是 Dalsa的 Genie_TS_M1920(黑白)和 Genie_TS_C2048(彩色)两款工业相机。

打开SDK包,SDK文件和例程在 Sapera文件夹中,SDK分x64和x86两个版本,x86的版本不能在64位机器上运行,x64的版本不能在32位机器上运行。

打开后

2、C#的使用方法

1)添加类库的引用,即Components/Net/Bin/DALSA.SaperaLT.SapClassBasic.dll文件的引用,注意x64和x86的版本问题。

2)声明SaperaLT的对象

我没有使用SDK中的视图对象,而是从缓存中取出图像数据转为C#的Bitmap,这样更灵活,所以不需要声明 SapView。

private SapLocation m_ServerLocation;   // 设备的连接地址
private SapAcqDevice m_AcqDevice; // 采集设备
private SapBuffer m_Buffers; // 缓存对象
private SapAcqDeviceToBuf m_Xfer; // 传输对象

3)创建对象

private bool CreateNewObjects()
{
// 创建采集设备
m_AcqDevice = new SapAcqDevice(m_ServerLocation, false);
if (m_AcqDevice.Create() == false)
{
DestroyObjects();
DisposeObjects();
return false;
}
// 创建缓存对象
if (SapBuffer.IsBufferTypeSupported(m_ServerLocation, SapBuffer.MemoryType.ScatterGather))
{
m_Buffers = new SapBufferWithTrash(, m_AcqDevice, SapBuffer.MemoryType.ScatterGather);
}
else
{
m_Buffers = new SapBufferWithTrash(, m_AcqDevice, SapBuffer.MemoryType.ScatterGatherPhysical);
}
if (m_Buffers.Create() == false)
{
DestroyObjects();
DisposeObjects();
return false;
}
// 创建传输对象
m_Xfer = new SapAcqDeviceToBuf(m_AcqDevice, m_Buffers);
m_Xfer.XferNotify += new SapXferNotifyHandler(m_Xfer_XferNotify);
m_Xfer.XferNotifyContext = this;
m_Xfer.Pairs[].EventType = SapXferPair.XferEventType.EndOfFrame;
m_Xfer.Pairs[].Cycle = SapXferPair.CycleMode.NextWithTrash;
if (m_Xfer.Pairs[].Cycle != SapXferPair.CycleMode.NextWithTrash)
{
DestroyObjects();
DisposeObjects();
return false;
}
if (m_Xfer.Create() == false)
{
DestroyObjects();
DisposeObjects();
return false;
}
return true;
}

4)销毁对象

private void DestroyObjects()
{
if (m_Xfer != null && m_Xfer.Initialized)
m_Xfer.Destroy();
if (m_Buffers != null && m_Buffers.Initialized)
m_Buffers.Destroy();
if (m_AcqDevice != null && m_AcqDevice.Initialized)
m_AcqDevice.Destroy();
} private void DisposeObjects()
{
if (m_Xfer != null)
{ m_Xfer.Dispose(); m_Xfer = null; }
if (m_Buffers != null)
{ m_Buffers.Dispose(); m_Buffers = null; }
if (m_AcqDevice != null)
{ m_AcqDevice.Dispose(); m_AcqDevice = null; }
}

5)获取参数值及最大值、最小值

参数值的类型有string,int,double,bool几种,需根据参数的可能值类型选择对应的方法,否则会出错。

文本型:

string val;

m_AcqDevice.GetFeatureValue(featureName, out val));

整数型:

int val;

m_AcqDevice.GetFeatureValue(featureName, out val));

小数型:

double val;

m_AcqDevice.GetFeatureValue(featureName, out val));

布尔型:

boolean val;

m_AcqDevice.GetFeatureValue(featureName, out val));

常用参数的值类型

中文名

参数名

值类型

图像X坐标

OffsetX

int

图像Y坐标

OffsetY

int

图像宽度

Width

int

图像高度

Height

int

采集帧率

AcquisitionFrameRate

double

曝光时间

ExposureTime

double

外触发方式

TriggerMode

bool

获取参数最大值,以整数类型举例:

SapFeature feature = new SapFeature(m_ServerLocation);
if (!feature.Create())
return -;
if (!m_AcqDevice.GetFeatureInfo(featureName, feature))
return -;
int maxValue = ;
if (!feature.GetValueMax(out maxValue))
return -;
return maxValue;

获取参数最小值,以整数类型举例:

SapFeature feature = new SapFeature(m_ServerLocation);
if (!feature.Create())
return -;
if (!m_AcqDevice.GetFeatureInfo(featureName, feature))
return -;
int minValue = ;
if (!feature.GetValueMin(out minValue))
return -;
return minValue;

6)设置参数值

设置参数值同样需要根据参数的值类型,选择对应的设参方法,否则会出现报错的情况,我发现使用字符型可以兼容,所以可以把值转为字符型,再设参。

string value;
m_AcqDevice.SetFeatureValue(featureName, value);

根据实际使用发现,曝光时间可以在采集过程中设置,采集帧率在采集过程中设置不能立即生效,需在下次采集方能生效,而X、Y坐标及图形宽度、高度、外触发模式需在设备对象创建后,缓存对象创建前进行设置,否则报错。

7)图形采集控制

开始采集:

m_Xfer.Grab();

停止采集:

m_Xfer.Freeze();

单张或指定张数抓拍:

m_Xfer.Snap();

8)图像获取及显示

开始采集后,得到每帧图像时,会触发XferNotify事件,可在此事件中进行图像的获取及显示工作。

首先需判断此帧是否是废弃帧,若是则立即返回,等待下一帧:

if (e.Trash) return;

取得缓存中的图像数据首地址:

IntPtr addr;

m_Buffers.GetAddress(out addr);

再将数据转为Bitmap对象:

PixelFormat pf = PixelFormat.Format8bppIndexed;
Bitmap bmp = new Bitmap(m_Buffers.Width, m_Buffers.Height, m_Buffers.Pitch, pf, addr);
bmp.Palette = m_grayPalette;

以上是8位黑白图像的转换方法,创建图像后需给Bitmap对象赋一个黑白调色板,创建调色板的代码如下:

using (Bitmap bmp = new Bitmap(, , PixelFormat.Format8bppIndexed))
{
m_grayPalette = bmp.Palette;
}
for (int i = ; i <= ; i++)
{
m_grayPalette.Entries[i] = Color.FromArgb(i, i, i);
}

如果是彩色相机,得到的数据是Bayer格式,需用Bayer转换方法,转换为24位彩色图片,我找到Aforge,OpenCV都可以进行Bayer转换。

Aforge的Bayer转换代码:

private BayerFilter m_bayerFilter = new BayerFilter();
m_bayerFilter.BayerPattern = new int[, ] { { RGB.G, RGB.B }, { RGB.R, RGB.G } };
bmp = m_bayerFilter.Apply(bmp);

OpenCV的Bayer转换代码:

IplImage *frame;
frame = cvCreateImage(cvSize(width, height), depth, );
frame->imageData = (char*)pData;
IplImage *bgr = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,);
cvCvtColor(frame, bgr, CV_BayerGR2BGR);
pDlg->ShowImage(bgr, IDC_PIC1);
cvReleaseImage(&frame);
cvReleaseImage(&bgr);

如果用Bitmap直接赋给PictureBox的办法,有时候会有内存泄露的情况,所以可采用GDI+绘图的方式显示图像,缺点是采集停止时,窗体被覆盖后图像会消失。

private void DrawImageInPictureBox(PictureBox picBox, Image img)
{
Graphics g = picBox.CreateGraphics();
g.DrawImage(img, , , picBox.Width, picBox.Height);
g.Dispose();
}

9)采集图像开窗和面阵做线扫描

图像开窗通过设置Width和Height两参数即可,经过实验发现,横向开窗对采集帧率最大值没有影响,而竖向开窗,采集帧率最大值会成比变化,竖向最小可设为2,即可当做线扫描使用,帧率最大可到1~2K。

如果做线扫使用,可以用List链表来存储每帧数据,最后再合成大图,转成Bitmap的方法是一样的,只是注意图像的高度是每帧高度乘以帧数。

DALSA相机SDK不完全教程的更多相关文章

  1. DALSA网口线扫相机SDK开发详解例程(C#版)

    首先吐槽一句,官方的demos写的真的不好,坑爹啊.对于小白来说,开发官方demos为我所用太难了.为什么呢?因为它Dalsa的DALSA.SaperaLT.SapClassBasic.dll中,不仅 ...

  2. Dalsa线扫相机SDK开发-小试牛刀(1)

    拿到了dalsa相机,可以用Sapera软件配置相机,进行图像采集.但是自己开发的话就得撸起袖子写代码了,查了两篇不错的博文,作为指导. Sapera帮助文档 - <好好先生>专栏 - 博 ...

  3. Dalsa线扫相机SDK下载和安装

    1.首先去官方网站下载SDK Support Downloads - Teledyne DALSA http://www.teledynedalsa.com/imaging/support/downl ...

  4. 基于Unity3D 的Vuforia SDK开发基础教程

    最新博客地址已转到: http://blog.csdn.net/zzlyw?viewmode=contents   ------------------------------------------ ...

  5. Android微信SDK API 调用教程1

    最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三 ...

  6. Android微信SDK API 调用教程

     最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这 ...

  7. Android微信SDK API 调用教程【转】

    原文:http://blog.csdn.net/worker90/article/details/8211451 最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官 ...

  8. linux下centos安装android sdk最新全面教程【可行】

    1.此教程解决了当你配置完android sdk的环境变量以后,可能在命令中打入adb还是提示错误.现在给大家提供最新解决方法,此方法同时可以解决最新的centos 6.5版本 2.本教程支持最新ja ...

  9. 海康相机SDK二次开发只有视频无声音问题

    海康SDK相信做企业开发的的同仁,在项目中经常会用到,毕竟使用范围这么广. 本次就开发遇到的奇葩问题来说明一下我们的解决方案. 场景 虽然海康有4200客户端,但是对于高度定制化的项目,肯定不能再使用 ...

随机推荐

  1. 关于tab的切换之共用html页面,而引发的页面跳转错乱问题

    在一个项目中的同一个模块中,有多个tab(并且多个tab对应的页面结构完全一样),tab的每次切换,不同tab调用不同的接口,利用一个switch进行判断,根据当前的类型去调用不同的接口,返回不同数据 ...

  2. Android getevent用法详解

    getevent 指令用于获取 input 输入事件,比如获取按键上报信息.获取触摸屏上报信息等. 指令源码路径:/system/core/toolbox/getevent.c getevent -h ...

  3. docker怎么破?

    为什么要装docker? 因为linux服务器不好用,很多操作不好进行,比如安装包没有管理员权限 docker可以访问本地显卡,比一般的virtual box 或者VMware都要好 怎么装docke ...

  4. python 高阶内置函数

    1.lambda 匿名函数 lambda 参数: 返回值 函数名统一都叫lambda. 2.sorted() 排序函数 排序函数 sorted(iterable,key,reverse) key:排序 ...

  5. H5测试 有空了解下里面没有用过的东西

  6. C++ 栈 (数组实现)

    上一篇用链表实现了stack,这篇我们采用数组来存储数据,数组更容易理解,直接贴代码 第一.代码实现 #pragma once #include <iostream> using name ...

  7. 主从DNS服务器的搭建

    一.DNS主从的理解 主从服务器,在一开始的理解中,以为是主的dns服务器挂掉后,(dns服务自动转向辅助dns服务器),客户端还能继续解析.事实貌似不是这样的.当我把主dns停掉的时候,客户端只设一 ...

  8. 浏览器及CURL代理设置

    需要代理的请求 代理服务器及端口 120.197.233.205 80 firefox为例浏览器代理设置:(浏览器端也可以通过foxyproxy插件方便设置) 选项->高级->网络-> ...

  9. ubuntu安装Percona Server

    Percona Server是mysql数据库的一个衍生版本,在性能,稳定性和可管理性上都有很大的提升,目前淘宝的mysql数据库就是基于Percona Server,请原谅我这么喜欢研究淘宝的技术. ...

  10. 「小程序JAVA实战」springboot的后台搭建(30)

    转自:https://idig8.com/2018/08/27/xiaochengxujavashizhanspringbootdehoutaidajian30/ 做了多年的开发,原来很多项目都是一个 ...