DALSA工业相机SDK二次开发(图像采集及保存)C#
一,首先先配置生成项目,根据官方文档步骤来:
这个没啥好说的,一步步照做就是了,就最后一步,开始我没重视,最后代码写完测试的时候还真的遇到问题了,一直出这样的错:
查了官方文档才看到最后一条~,然后在项目属性中把这个勾掉了,代码完美运行拉……
二,功能步骤
其实整个步骤很简单:
1,首先初始化连接相机:点击Init按钮会有MessageBox打印相机名
2,然后读取配置文件(配置文件是通过官方自带的CamExpert来生成的)读取参数,也可以在程序中配置,本程序有个setting按钮,按一下就可以配置拉,把想配置的参数写在对应的代码块里(当然小编很懒,没做显示的功能,所以按按钮的时候你可能觉得按了个寂寞,但已经配置好了)。还有个读取参数的按钮(当然小编也没做显示的功能,所以也按了个寂寞),但有助于debug的时候查看数据,也可以自己打印出来看看。
3,Snap是快照,可以设置快照的张数,因为写本程序时只有相机没有镜头,所以是黑乎乎一片…但用光源照的时候会呈现白色,所以还是有点反应知道不是卡住的哈哈。
4,Grab就是连续抓取图像了,Freeze是停止。
5,最后的保存结果(没有镜头只能可怜巴巴的用感光性来测试了T_T)
PS:程序最重要的是一个回调函数:m_Xfer_XferNotify,每读取一帧图片的时候会调用这个函数,当然回调函数是自己加的,通过这个命令:
m_Xfer.XferNotify += new SapXferNotifyHandler(m_Xfer_XferNotify);
这条命令和m_Xfer_XferNotify函数是精髓!精髓!精髓!
没啥说的,上代码。可运行代码一字不差的放上来咯,注释也尽可能详细了:
1 using System; 2 using Systemollections.Generic; 3 using SystemponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.Drawing.Imaging; 11 using DALSA.SaperaLT.SapClassBasic; 12 13 namespace dalsaSave 14 31 32 private void Form1_Load(object sender, EventArgs e) 33 36 37 private void Form1_FormClosed(object sender, FormClosedEventArgs e) 38 42 43 // 初始化并连接相机 44 private void btn_init_Click(object sender, EventArgs e) 45 48 49 private void btn_setting_Click(object sender, EventArgs e) 50 57 m_AcqDevice.SetFeatureValue("Gain", "9.9"); 58 } 59 60 private void btn_getValue_Click(object sender, EventArgs e) 61 88 89 #region 90 private void btn_snap_Click(object sender, EventArgs e) 91 95 96 private void btn_grab_Click(object sender, EventArgs e) 97 100 101 102 //关闭的时候,执行Freez()停止采集,线程等待5秒, 103 //目的是停止采集后,将还存在内存地址通道中的裸数据都取出来, 104 //如果freeze之后直接释放,就拿不到还在地址上的数据了,缓存对象释放之后,将本次采集所有对象摧毁。 105 106 private void btn_freeze_Click(object sender, EventArgs e) 107 110 #endregion 111 112 //得到所有连接的相机信息,并将他们加入到ArrayList里面去 113 public bool GetCameraInfo(out string sCameraName, out int nIndex) 114 138 } 139 140 int count = 1; 141 string deviceName = ""; 142 foreach (string sName in listServerNames) 143 147 148 sCameraName = serverName; 149 nIndex = GenieIndex; 150 151 return bFind; 152 153 } 154 155 156 // 初始化并连接相机 157 public bool CreateNewObjects() 158 169 else 170 174 175 m_ServerLocation = new SapLocation(Name, 0); 176 177 //创建采集设备,new SapAcqDevice()的括号中第二个参数既可以写配置文件路径,也可以写false,false是用相机当前的设置 178 // 获取相机信息,加载相机配置文件(用相机专家调整好参数后导出ccf文件),加载参数 179 if (configFilePath.Length > 0) 180 m_AcqDevice = new SapAcqDevice(m_ServerLocation, configFilePath); 181 else 182 m_AcqDevice = new SapAcqDevice(m_ServerLocation, false); 183 184 Console.WriteLine(m_AcqDevicereate()); 185 186 if (m_AcqDevicereate() == false) 187 193 194 // 创建缓存对象 195 if (SapBuffer.IsBufferTypeSupported(m_ServerLocation, SapBuffer.MemoryType.ScatterGather)) 196 199 else 200 203 204 if (m_Buffersreate() == false) 205 210 211 //设置行频,注意:行频在相机工作时不能设置(曝光、增益可以),最好在初始化阶段设置 212 m_AcqDevice.SetFeatureValue("AcquisitionLineRate", 20000.0); 213 214 //创建传输对象 215 m_Xfer = new SapAcqDeviceToBuf(m_AcqDevice, m_Buffers); 216 217 // 这一句是核心,这是回调函数,就靠它采图了 218 m_Xfer.XferNotify += new SapXferNotifyHandler(m_Xfer_XferNotify); 219 m_Xfer.XferNotifyContext = this; 220 m_Xfer.Pairs[0].EventType = SapXferPair.XferEventType.EndOfFrame; 221 m_Xfer.Pairs[0]ycle = SapXferPairycleMode.NextWithTrash; 222 if (m_Xfer.Pairs[0]ycle != SapXferPairycleMode.NextWithTrash) 223 228 if (m_Xferreate() == false) 229 234 235 return true; 236 } 237 238 239 private void DestroyObjects() 240 248 249 250 private void DisposeObjects() 251 257 if (m_Buffers != null) 258 262 if (m_AcqDevice != null) 2 267 } 268 269 270 void m_Xfer_XferNotify(object sender, SapXferNotifyEventArgs argsNotify) 271 )); 290 291 292 picCountNum++; 293 294 // 保存到本地。这个save方法就是从SDK中提取出来的,给上参数,就可以实现图片的保存,不用借助其他任何的技术方法 295 m_Buffers.Save(imgPath + picCountNum + ".bmp", "format bmp" ); 296 297 298 // 从内存读取图片,并转换成bitmap格式,创建调色板,打印到PictureBox 299 PixelFormat pf = PixelFormat.Format8bppIndexed; 300 Bitmap bmp = new Bitmap(weight, height, m_Buffers.Pitch, pf, addr); 301 ColorPalette m_grayPalette; 302 using (Bitmap tempbmp = new Bitmap(1, 1, PixelFormat.Format8bppIndexed)) 303 306 for (int i = 0; i <= 255; i++) 307 310 311 bmp.Palette = m_grayPalette; 312 313 Image img = Image.FrHbitmap(bmp.GetHbitmap()); 314 picBox.Image = img; 315 } 316 317 private void UpdateFrameRate() 318 331 } 332 333 // 获得相机参数的最大值(行频和曝光时间是近似倒数的关系,获得参数最大值可以防止设置参数超限) 334 private double GetMaxValue(string featureName) 335 344 345 // 这个一般用的少,最小值一般是很小的数(比如Gain最小0.125, width最小128),我们一般不会设置这样的数 346 private double GetMinValue(string featureName) 347 356 } 357 }下一篇:Qt 读写txt文本文件
C# 相机镜头光源
pla文件怎么看,pla文件用什么打开?
pl1文件怎么看,pl1文件用什么打开?
pl文件怎么看,pl文件用什么打开?
pl0文件怎么看,pl0文件用什么打开?
pkt文件怎么看,pkt文件用什么打开?
pkm文件怎么看,pkm文件用什么打开?
pks文件怎么看,pks文件用什么打开?
pka文件怎么看,pka文件用什么打开?
pkh文件怎么看,pkh文件用什么打开?
pkg文件怎么看,pkg文件用什么打开?