C# + Basler 카메라 이미지 수집 DLL

6143 단어 CameraC#
다음은 제가 c#로 쓴 basler 카메라의 이미지를 채취하는 프로그램입니다. 여러분께 공유해 드리겠습니다.
두 부분으로 나뉘는데 첫 번째 부분은 DLL 내용이고 두 번째 부분은 호출이다.
섹션 1:
using Basler.Pylon;
using System;
using System.Drawing;
using System.Drawing.Imaging;
namespace CameraForms
{
    public class baslerCamcs
    { 
        //       
        public int CameraNumber = CameraFinder.Enumerate().Count;

        //  +   =     ,           
        public delegate void CameraImage(Bitmap bmp);
        public event CameraImage CameraImageEvent;
        
        //    Camera
        Camera camera;

        //basler                
        PixelDataConverter pxConvert = new PixelDataConverter();

        //           
        bool GrabOver = false;


        //     
        public void CameraInit()
        {
             camera = new Camera();
            //      
            camera.CameraOpened += Configuration.AcquireContinuous;

            //      
            camera.ConnectionLost += Camera_ConnectionLost; 
            
            //      
            camera.StreamGrabber.GrabStarted += StreamGrabber_GrabStarted;

            //      
            camera.StreamGrabber.ImageGrabbed += StreamGrabber_ImageGrabbed;

            //      
            camera.StreamGrabber.GrabStopped += StreamGrabber_GrabStopped;

            //    
            camera.Open();
        }
        private void StreamGrabber_GrabStarted(object sender, EventArgs e)
        {
            GrabOver = true;
        }
        private void StreamGrabber_ImageGrabbed(object sender, ImageGrabbedEventArgs e)
        {
            IGrabResult grabResult = e.GrabResult;
            if(grabResult.IsValid)
            {
                if (GrabOver)
                    CameraImageEvent(GrabResult2Bmp(grabResult));
            }
        }

        private void StreamGrabber_GrabStopped(object sender, GrabStopEventArgs e)
        {
            GrabOver = false;
        }

        private void Camera_ConnectionLost(object sender, EventArgs e)
        {
            camera.StreamGrabber.Stop();
            DestroyCamera();
        }

        public void OneShot()
        {
            if(camera != null)
            {
                camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.SingleFrame);
                camera.StreamGrabber.Start(1,GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
            }
        }

        public void KeepShot()
        {
            if (camera != null)
            {
                camera.Parameters[PLCamera.AcquisitionMode].SetValue(PLCamera.AcquisitionMode.Continuous);
                camera.StreamGrabber.Start(GrabStrategy.OneByOne, GrabLoop.ProvidedByStreamGrabber);
            }
        }

        public void Stop()
        {
            if (camera != null)
            {
                camera.StreamGrabber.Stop();
            }
        }

        //            Bitmap  
        Bitmap GrabResult2Bmp(IGrabResult grabResult)
        {
            Bitmap b = new Bitmap(grabResult.Width, grabResult.Height, PixelFormat.Format32bppRgb);
            BitmapData bmpData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
            pxConvert.OutputPixelFormat = PixelType.BGRA8packed;
            IntPtr bmpIntpr = bmpData.Scan0;
            pxConvert.Convert(bmpIntpr, bmpData.Stride * b.Height, grabResult);
            b.UnlockBits(bmpData);
            return b;
        }

        //    
        public void DestroyCamera()
        {
            if(camera !=null)
            {
                camera.Close();
                camera.Dispose();
                camera = null;
            }
        }
    }
}

섹션 2:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace CameraForms
{
    public partial class MainForm : Form
    {
        baslerCamcs camera = new baslerCamcs();
        public MainForm()
        {
            InitializeComponent();
            camera.CameraImageEvent += Camera_CameraImageEvent;
        }

        private void Camera_CameraImageEvent(Bitmap bmp)
        {
            pictureBox1.Invoke(new MethodInvoker(delegate
            {
                Bitmap old = pictureBox1.Image as Bitmap;
                pictureBox1.Image = bmp;
                if (old != null)
                    old.Dispose();
            }));
        }

        void Unanble()
        {
            button_stop.Enabled = false;
            button_Oneshot.Enabled = false;
            button_keepShot.Enabled = false;
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            if (camera.CameraNumber > 0)
                camera.CameraInit();
            else
            {
                MessageBox.Show("      ");
                Unanble();
            }
        }
        //  
        private void button_stop_Click(object sender, EventArgs e)
        {
             camera.Stop();
        }
        //   
        private void button_Oneshot_Click(object sender, EventArgs e)
        {
            camera.OneShot();
        }
        //   
        private void button_keepShot_Click(object sender, EventArgs e)
        {
            camera.KeepShot();  
        }
        //    ,    
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            camera.DestroyCamera();
        }
    }
}

효과도:
2019_02_23;
 
2019_05_08 -> using System이 삭제되었습니다.Linq;
CameraFinder.Enumerate().Count()가 CameraFinder로 수정되었습니다.Enumerate().Count;
using Basler가 추가되었습니다.Pylon;
 
2019_06_10 ->
    1.Basler.Pylon, 이 dll은 Basler 카메라를 설치한 sdk에서만 사용할 수 있습니다.sdk의 C#의 Sample 프로그램을 많이 보십시오. Basler를 보십시오.Pylon 프로젝트
    2.만약 네가 나의 코드에 따라 프로그램을 쓴다면, 너의 하드웨어는 문제가 없을 것이다. 그러면 나의 이 코드는 일반적으로 문제가 생기지 않을 것이다.
    3.일반적으로 말하면 카메라를 쓸 줄 알고 너는 다른 카메라의 프로그램을 쓸 줄 안다. 나는 basler를 쓴 후에 방성카메라를 쓰고 Crevis카메라를 쓴다. 카메라의 이런 프로그램들은 일반적으로 대동소이하다.전제 조건은 카메라 측이 제공한 sdk에 C#의 인터페이스가 있다는 것이다.
    4.이 코드는 비교적 기초적이다.여분의 코드가 있고 하드웨어 트리거 기능이 설치되어 있지 않으며trycatch가 없어서 개선해야 할 부분이 많습니다. 이것들은 여러분에게 맡깁니다.

좋은 웹페이지 즐겨찾기