有人问到如何使用相机的SDK采集图像,其实这个问题相机的生产厂家已经给了答案,只是使用者不看别人的说明而已。由于我这里只有康耐视与巴斯勒的相机,就以巴斯勒的相机为例,给大家写个简单的例子。
按照Basler官方文档说明,康耐视CAM-CIC-5000系列的相机也能使用Basler SDK取图,但是据我实测,无法识别相机,最后采用Basler acg-2500相机完成这次测试。
首先去Basler官网下载SDK,就是那个pylon程序,里面集成了相机调试工具及SDK,自行安装。
然后使用pylon IP Configurator程序配置相机信息,主要是修改ip,使相机与电脑在同一局域网下。
设置好后,打开pylon Viewer程序,这是basler提供的相机调试工具,测试下相机是否正常,然后就可以开始进入VS开发了。
代码很简单,pylon Viewer提供的开发文档中有详细说明。
实例代码
采集效果如下:
添加Basler引用,复制安装目录pylon 6/Development/Assemblies/Basler.Pylon/x64路径下的Basler.Pylon.dll
文件到你的项目debug目录下,并使用using Basler.Pylon;
引用。
声明全局变量
List<ICameraInfo> allCameras;//存储所有相机 Camera mCamera;//相机对象
获取所有相机信息
allCameras = CameraFinder.Enumerate();
实例化相机对象
mCamera = new Camera(allCameras[0]);
打开相机连接
mCamera.Open();
注意:一旦打开相机连接,必须有关闭,否则相机将会连接不上,这种情况下等待几分钟后,连接对象会被系统回收,再次连接即可。
关闭相机
mCamera.Close();
取图
mCamera.StreamGrabber.Start(); IGrabResult grabResult = mCamera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException); if (grabResult.GrabSucceeded) { //将图像数据转换为位图 Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); PixelDataConverter converter = new PixelDataConverter(); converter.OutputPixelFormat = PixelType.BGRA8packed; IntPtr ptrBmp = bmpData.Scan0; converter.Convert(ptrBmp, bmpData.Stride * bitmap.Height, grabResult); bitmap.UnlockBits(bmpData); //使用visionpro显示控件显示出来 cogRecordDisplay1.Image = new CogImage8Grey(bitmap); } else { Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, grabResult.ErrorDescription); } mCamera.StreamGrabber.Stop();
使用事件采集图像(推荐)
注册采集图像事件
mCamera.StreamGrabber.ImageGrabbed += OnImageGrabbed;
图像处理方法
public void OnImageGrabbed(Object sender, ImageGrabbedEventArgs e) { Console.WriteLine("采集图像处理"); IGrabResult grabResult = e.GrabResult; if (grabResult.GrabSucceeded) { //转换图像数据 Bitmap bitmap = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); PixelDataConverter converter = new PixelDataConverter(); converter.OutputPixelFormat = PixelType.BGRA8packed; IntPtr ptrBmp = bmpData.Scan0; converter.Convert(ptrBmp, bmpData.Stride * bitmap.Height, grabResult); bitmap.UnlockBits(bmpData); //visionpro控件显示图像 cogRecordDisplay1.Image = new CogImage8Grey(bitmap); } else { Console.WriteLine("Error: {0} {1}", grabResult.ErrorCode, grabResult.ErrorDescription); } }
采集图像方法
mCamera.StreamGrabber.Start(); IGrabResult grabResult = mCamera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.ThrowException); mCamera.StreamGrabber.Stop();
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241966.html