DALSA相机SDK不完全教程

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(2, m_AcqDevice, SapBuffer.MemoryType.ScatterGather);

}

else

    {

m_Buffers = new SapBufferWithTrash(2, 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[0].EventType = SapXferPair.XferEventType.EndOfFrame;

m_Xfer.Pairs[0].Cycle = SapXferPair.CycleMode.NextWithTrash;

if (m_Xfer.Pairs[0].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 -1;

if (!m_AcqDevice.GetFeatureInfo(featureName, feature))

return -1;

int maxValue = 0;

if (!feature.GetValueMax(out maxValue))

return -1;

return maxValue;

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

SapFeature feature = new SapFeature(m_ServerLocation);

if (!feature.Create())

return -1;

if (!m_AcqDevice.GetFeatureInfo(featureName, feature))

return -1;

int minValue = 0;

if (!feature.GetValueMin(out minValue))

return -1;

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(1, 1, PixelFormat.Format8bppIndexed))

{

m_grayPalette = bmp.Palette;

}

for (int i = 0; i <= 255; 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[2, 2] { { RGB.G, RGB.B }, { RGB.R, RGB.G } };

bmp = m_bayerFilter.Apply(bmp);

OpenCV的Bayer转换代码:

IplImage *frame;

frame = cvCreateImage(cvSize(width, height), depth, 1);

frame->imageData = (char*)pData;

IplImage *bgr = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);

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, 0, 0, picBox.Width, picBox.Height);

g.Dispose();

}

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

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

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

时间: 2024-10-27 20:32:44

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

Android SDK的安装教程

Android4.1虽说已经发布了好些天,但由于的我手机比较坑,系统依旧保持在2.3.4.0的都是可望不可即的了,就别说4.1.由于资金的问题,没法换手机,只能另想方法,通过在笔记本上装android4.1来过过瘾,哈哈.虽然没法触屏和重力感应(这也是没办法的),不过可以用鼠标点击代替触屏嘛,呵呵.先来看看效果图: 现在不废话了,1.首先要下载安装Java JDK,下载地址:http://pan.baidu.com/share/link?shareid=7368&uk=2148507123 然后

Dalsa相机使用问题记录——————————(一)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Date: 20180821 1. 由于IP原因导致找不到相机 解决方法:查看相机IP,并配置好本地网口的网络属性. 首先,查看windows的网络适配器界面,发现有多个网口,如图: 分别查看IPv4属性: 发现是自动获取IP地址.这时,我们可以初步推断-

Dalsa相机使用问题记录——————————(二)长宽比

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Date: 20180821 2. 如何调节Dalsa相机长宽比,使之接近于真实的长宽比 取图之后,发现得到图像的物体长宽比不同于物体的真实长宽比,也就是说,物体变形了.如何解决这种问题? 原文地址:https://www.cnblogs.com/xiaw

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

1.此教程解决了当你配置完android sdk的环境变量以后,可能在命令中打入adb还是提示错误.现在给大家提供最新解决方法,此方法同时可以解决最新的centos 6.5版本 2.本教程支持最新java8,并与此为例. 工具/原料 java8下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 注:ubuntu选tar.gz后缀:centos选rmp后缀 android sdk(内包括eclipse)下载

Android微信SDK API 调用教程

最近一直在调用微信的API,却发现一直调用不成功,纠结了好久,各方面找教程,找官方,官方里的文档也只是写得很模糊,说是按三步走. 1.申请App_ID 2.填写包名3. 获取程序签名的md5值, 这三步只要你走对了就能调通,可是大家都不知道有时候我们Eclipse调用的keystore和我们打包的keystore获取到的程序签名的md5是不一样的.而且是每一个keystore对应生成的apk的值都会不一样.我们在申请的时候填的程序签名值是正式打包的,但我们在eclipse部署上去的却是用的我们默

相机SDK开发

本人在用halcon做图像处理做视觉项目时,通常都是用c#写程序的主体架构,然后将halcon的图像处理过程嵌套进去.所以做了一个basler相机采图并用halcon显示的demo,写这篇文章用于记录过程中的一些心得和遇到的问题,这里分享给大家,希望有大佬帮忙斧正. 程序界面如上图.首先是一些先期的设置.开发环境是win7 64位,用的软件是VS2013和HALCON13,还用到了basler相机的SDK :pylon5. 首先是halcon和VS2013C#的配置:在VS里的工具选项卡→选择工

DALSA相机开发--修改参数

DALSA gige相机有两种方式可以获取到相机相关参数,一个是读取相机里面的xml文件:另外一个是读取相对应的寄存器的值. 对于修改寄存器的值,有两个相应的函数: 1)GevSetFeatureValue 函数原型为: GEV_STATUS GevSetFeatureValue(GEV_CAMEAR_HANDLE handle, const char *feature_name, int value_size, void *value); 2)GevSetFeatureValueAsStrin

微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 前几章中我讲解了微信开发平台提供第三方平台的好处,和使用流程,如果你看了我的文章相信你对开放平台有了初步的了解,但是在实际的开发过程

Hyperledger Fabric Java SDK最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程. 如果希望快速掌握Fabric Java SDK的使用方法,建议访问汇智网的在线互动教程: Fabric区块链Java开发详解 1.官方文档 使用Fabric Java SDK开发必备的手册,从Java SDK源代码注释生成的每个接口.类和方法的简要说明,聊胜于无,但是要指望它达到真