Bootstrap

电脑连接海康相机并在PictureBox和HWindowControl中分别显示。

展示结果:

下面附上界面中所有控件的Name,只需照着红字设置对应的控件Name即可

下面附上小编主界面的全部代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;
using MvCameraControl;

namespace MVC
{
    public partial class Form1 : Form
    {
        // ch:枚举的相机类型 | en:TLayerType for enumerate devices
        readonly DeviceTLayerType enumTLayerType = DeviceTLayerType.MvGigEDevice | DeviceTLayerType.MvUsbDevice
    | DeviceTLayerType.MvGenTLGigEDevice | DeviceTLayerType.MvGenTLCXPDevice | DeviceTLayerType.MvGenTLCameraLinkDevice | DeviceTLayerType.MvGenTLXoFDevice;

        List<IDeviceInfo> deviceInfoList = new List<IDeviceInfo>();
        IDevice device = null;
        bool isGrabbing = false; //是否正在取图
        Thread receiveThread = null;  //接收图像线程
        Thread receiveImage = null;
        IntPtr pictureBoxHandle = IntPtr.Zero; //显示图像的控件句柄


        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //初始化SDK
            SDKSystem.Initialize();
            //枚举设备
            RefreshDeviceList();
        }
        /// <summary>
        /// ch:显示错误信息 | en:Show error message
        /// </summary>
        private void ShowErrorMsg(string message, int errorCode)
        {
            string errorMsg;
            if (errorCode == 0)
            {
                errorMsg = message;
            }
            else
            {
                errorMsg = message + ": Error =" + String.Format("{0:X}", errorCode);
            }

            switch (errorCode)
            {
                case MvError.MV_E_HANDLE: errorMsg += " Error or invalid handle "; break;
                case MvError.MV_E_SUPPORT: errorMsg += " Not supported function "; break;
                case MvError.MV_E_BUFOVER: errorMsg += " Cache is full "; break;
                case MvError.MV_E_CALLORDER: errorMsg += " Function calling order error "; break;
                case MvError.MV_E_PARAMETER: errorMsg += " Incorrect parameter "; break;
                case MvError.MV_E_RESOURCE: errorMsg += " Applying resource failed "; break;
                case MvError.MV_E_NODATA: errorMsg += " No data "; break;
                case MvError.MV_E_PRECONDITION: errorMsg += " Precondition error, or running environment changed "; break;
                case MvError.MV_E_VERSION: errorMsg += " Version mismatches "; break;
                case MvError.MV_E_NOENOUGH_BUF: errorMsg += " Insufficient memory "; break;
                case MvError.MV_E_UNKNOW: errorMsg += " Unknown error "; break;
                case MvError.MV_E_GC_GENERIC: errorMsg += " General error "; break;
                case MvError.MV_E_GC_ACCESS: errorMsg += " Node accessing condition error "; break;
                case MvError.MV_E_ACCESS_DENIED: errorMsg += " No permission "; break;
                case MvError.MV_E_BUSY: errorMsg += " Device is busy, or network disconnected "; break;
                case MvError.MV_E_NETER: errorMsg += " Network error "; break;
            }

            MessageBox.Show(errorMsg, "PROMPT");
        }
        private void RefreshDeviceList()
        {
            //创建设备列表
            cbDeviceList.Items.Clear();
            int nRet = DeviceEnumerator.EnumDevices(enumTLayerType, out deviceInfoList);
            if (nRet != MvError.MV_OK)
            {
                ShowErrorMsg("Enumerate devices fail !", nRet);
                return;
            }
            //在窗体列表中显示设备名
            for (int i = 0; i < deviceInfoList.Count; i++)
            {
                IDeviceInfo deviceInfo = deviceInfoList[i];
                if (deviceInfo.UserDefinedName != "")
                {
                    cbDeviceList.Items.Add(deviceInfo.TLayerType.ToString() + ": " + deviceInfo.UserDefinedName + " (" + deviceInfo.SerialNumber + ")");

                }
                else
                {
                    cbDeviceList.Items.Add(deviceInfo.TLayerType.ToString() + ": " + deviceInfo.ManufacturerName + " " + deviceInfo.ModelName + " (" + deviceInfo.SerialNumber + ")");

                }
            }
            //选择第一项
            if (deviceInfoList.Count != 0)
            {
                cbDeviceList.SelectedIndex = 0;
            }
        }

        private void bnClose_Click(object sender, EventArgs e)
        {
            //取流标志位清零
            if (isGrabbing == true)
            {
                bnStopGrab_Click(sender, e);
            }
            //关闭设备
            if (device != null)
            {
                device.Close();
                device.Dispose();
            }
            //控件操作
            SetCtrlWhenClose();
        }
        private void SetCtrlWhenClose()
        {
            bnOpen.Enabled = true;

            bnClose.Enabled = false;
            bnStartGrab.Enabled = false;
            bnStopGrab.Enabled = false;
            bnContinuesMode.Enabled = false;
            bnTriggerMode.Enabled = false;
            cbSoftTrigger.Enabled = false;
            bnTriggerExec.Enabled = false;

            tbExposure.Enabled = false;
            tbGain.Enabled = false;
            tbFrameRate.Enabled = false;
            bnGetParam.Enabled = false;
            bnSetParam.Enabled = false;

        }

        private void bnEnum_Click(object sender, EventArgs e)
        {
            RefreshDeviceList();
        }

        private void bnOpen_Click(object sender, EventArgs e)
        {
            if (deviceInfoList.Count == 0 || cbDeviceList.SelectedIndex == -1)
            {
                ShowErrorMsg("No device, please select", 0);
                return;
            }
            //获取选择的设备信息
            IDeviceInfo deviceInfo = deviceInfoList[cbDeviceList.SelectedIndex];

            try
            {
                //打开设备
                device = DeviceFactory.CreateDevice(deviceInfo);

            }
            catch (Exception ex)
            {
                MessageBox.Show("Create Device fail !" + ex.Message);
                return;
            }

            int result = device.Open();
            if (result != MvError.MV_OK)
            {
                ShowErrorMsg("Open Device fail", result);
                return;
            }
            //判断是否为gige设备
            if (device is IGigEDevice)
            {
                //转换为gige设备
                IGigEDevice gigEDevice = device as IGigEDevice;
                //探测网络最佳包大小
                int optionPacketSize;
                result = gigEDevice.GetOptimalPacketSize(out optionPacketSize);
                if (result != MvError.MV_OK)
                {
                    ShowErrorMsg("Waring: Get packet Size failed !", result);

                }
                else
                {
                    result = device.Parameters.SetIntValue("GevSCPSPPacketSize", (long)optionPacketSize);
                    if (result != MvError.MV_OK)
                    {
                        ShowErrorMsg("Waring: Set Packet Size failed", result);

                    }
                }
            }
            //设置采集卡连续模式
            device.Parameters.SetEnumValueByString("AcauisitionMode", "Continuous");
            device.Parameters.SetEnumValueByString("TriggerMode", "Off");//关闭触发模式

            //控件操作
            SetCtrlWhenOpen();

            //获取参数
            bnGetParam_Click(null, null);

        }
        private void SetCtrlWhenOpen()
        {
            bnOpen.Enabled = false;
            bnClose.Enabled = true;

            bnStartGrab.Enabled = true;
            bnStopGrab.Enabled = false;
            bnContinuesMode.Enabled = true;
            bnContinuesMode.Checked = true;
            //bnContinuesMode_CheckedChanged(null,null);
            bnTriggerMode.Enabled = true;
            cbSoftTrigger.Enabled = false;
            bnTriggerExec.Enabled = false;

            tbExposure.Enabled = true;
            tbGain.Enabled = true;
            tbFrameRate.Enabled = true;
            bnGetParam.Enabled = true;
            bnSetParam.Enabled = true;

        }
        private void GetTriggerMode()
        {
            IEnumValue enumValue;
            int result = device.Parameters.GetEnumValue("TriggerMode", out enumValue);
            if (result == MvError.MV_OK)
            {
                if (enumValue.CurEnumEntry.Symbolic == "On")
                {
                    bnTriggerMode.Checked = true;
                    bnContinuesMode.Checked = false;
                    result = device.Parameters.GetEnumValue("TriggerMode", out enumValue);
                    if (result == MvError.MV_OK)
                    {
                        if (enumValue.CurEnumEntry.Symbolic == "TriggerSoftware")
                        {
                            cbSoftTrigger.Enabled = true;
                            cbSoftTrigger.Checked = true;
                            if (isGrabbing)
                            {
                                bnTriggerExec.Enabled = true;
                            }
                        }
                    }
                }
                else
                {
                    bnContinuesMode.Checked = true;
                    bnTriggerMode.Checked = false;
                }
            }
        }
        private void bnGetParam_Click(object sender, EventArgs e)
        {
            GetTriggerMode();

            IFloatValue floatValue;
            int result = device.Parameters.GetFloatValue("ExposureTime", out floatValue);
            if (result == MvError.MV_OK)
            {
                tbExposure.Text = floatValue.CurValue.ToString("F1");
            }

            result = device.Parameters.GetFloatValue("Gain", out floatValue);
            if (result == MvError.MV_OK)
            {
                tbGain.Text = floatValue.CurValue.ToString("F1");

            }

            result = device.Parameters.GetFloatValue("ResultingFrameRate", out floatValue);
            if (result == MvError.MV_OK)
            {
                tbFrameRate.Text = floatValue.CurValue.ToString("F1");
            }

            IEnumValue enumValue;
            result = device.Parameters.GetEnumValue("PixelFormat", out enumValue);
            if (result == MvError.MV_OK)
            {
                tbPixelFormat.Text = enumValue.CurEnumEntry.Symbolic;
            }

        }

        private void bnSetParam_Click(object sender, EventArgs e)
        {
            try
            {
                float.Parse(tbExposure.Text);
                float.Parse(tbGain.Text);
                float.Parse(tbFrameRate.Text);
            }
            catch
            {
                ShowErrorMsg("Please enter correct type !", 0);
                return;
            }
            device.Parameters.SetEnumValue("ExposureAuto", 0);
            int result = device.Parameters.SetFloatValue("ExposureTime", float.Parse(tbExposure.Text));
            if (result != MvError.MV_OK)
            {
                ShowErrorMsg("Set Gain Fail", result);
            }

            device.Parameters.SetEnumValue("GainAuto", 0);
            result = device.Parameters.SetFloatValue("Gain", float.Parse(tbGain.Text));
            if (result != MvError.MV_OK)
            {
                ShowErrorMsg("Set Gain Fail !", result);
            }

            result = device.Parameters.SetBoolValue("AcquisitionFrameRateEnable", true);
            if (result != MvError.MV_OK)
            {
                ShowErrorMsg("Set AcquisitionFrameRateEnable Fail !", result);
            }
            else
            {
                result = device.Parameters.SetFloatValue("AcquisitionFrameRate", float.Parse(tbFrameRate.Text));
                if (result != MvError.MV_OK)
                {
                    ShowErrorMsg("Set Frame Rate Fail !", result);
                }
            }
        }

        private void bnStopGrab_Click(object sender, EventArgs e)
        {
            //标志位设为false
            isGrabbing = false;
            receiveThread.Join();

            //停止采集
            int result = device.StreamGrabber.StopGrabbing();
            if (result != MvError.MV_OK)
            {
                ShowErrorMsg("Stop Grabbing Fail !", result);
            }
            //控件操作
            SetCtrlWhenStopGrab();
        }
        private void SetCtrlWhenStopGrab()
        {
            bnStartGrab.Enabled = true;
            bnStopGrab.Enabled = false;

            cbSoftTrigger.Enabled = false;
            bnTriggerExec.Enabled = false;
        }

        private void bnTriggerExec_Click(object sender, EventArgs e)
        {
            //触发命令
            int result = device.Parameters.SetCommandValue("TriggerSoftware");
            if (result != MvError.MV_OK)
            {
                ShowErrorMsg("Trigger Software Fail !", result);
            }
        }

        private void cbSoftTrigger_CheckedChanged(object sender, EventArgs e)
        {
            //触发源设为软触发
            if (cbSoftTrigger.Checked)
            {
                device.Parameters.SetEnumValueByString("TriggerSource", "Software");
                if (isGrabbing)
                {
                    bnTriggerExec.Enabled = true;
                }
            }

            if (!cbSoftTrigger.Checked)
            {
                device.Parameters.SetEnumValueByString("TriggerSource", "Line0");
                bnTriggerExec.Enabled = false;
            }

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            bnClose_Click(null, null);
            //反初始化
            SDKSystem.Finalize();
        }

        private void bnContinuesMode_CheckedChanged(object sender, EventArgs e)
        {
            if (bnContinuesMode.Checked)
            {
                device.Parameters.SetEnumValueByString("TriggerMode", "Off");
                cbSoftTrigger.Enabled = false;
                bnTriggerExec.Enabled = false;
            }
        }

        private void bnTriggerMode_CheckedChanged(object sender, EventArgs e)
        {
            if (bnTriggerMode.Checked)
            {
                //打开触发模式

                device.Parameters.SetEnumValueByString("TriggerMode", "On");
                if ((bool)cbSoftTrigger.Checked)
                {
                    device.Parameters.SetEnumValueByString("TriggerSource", "Software");
                    if (isGrabbing)
                    {
                        bnTriggerExec.Enabled = true;
                    }
                }
                else
                {
                    device.Parameters.SetEnumValueByString("TriggerSource", "Line0");
                }
                cbSoftTrigger.Enabled = true;
                cbSoftTrigger.Checked = true;

            }
        }

        public void ReciveThreadProcess()
        {
            IFrameOut frameOut = null;
            int result = MvError.MV_OK;
            while (isGrabbing)
            {
                result = device.StreamGrabber.GetImageBuffer(1000, out frameOut);
                if (result == MvError.MV_OK)
                {
                    device.ImageRender.DisplayOneFrame(pictureBoxHandle, frameOut.Image);
                    device.StreamGrabber.FreeImageBuffer(frameOut);
                }
            }
           
        }
        public void ReciveThreadImage()
        {
            IFrameOut frameOut = null;
            int result = MvError.MV_OK;

            int windowWidth = hWindowControl1.Width;
            int windowHeight = hWindowControl1.Height;
            double windowAspect = (double)windowWidth / windowHeight;

            while (isGrabbing)
            {
                result = device.StreamGrabber.GetImageBuffer(1000, out frameOut);
                if (result == MvError.MV_OK)
                {

                    IImage image = frameOut.Image;

                    int width = (int)image.Width;
                    int height = (int)image.Height;

                    double imageAspect = (double)width / height;

                    int row1, col1, row2, col2;
                    if (imageAspect > windowAspect)
                    {
                        col1 = 0;
                        col2 = width - 1;
                        int newHeight = (int)(width / windowAspect);
                        row1 = (width - newHeight) / 2;
                        row2 = row1 + newHeight - 1;
                    }
                    else
                    {
                        row1 = 0;
                        row2 = height - 1;
                        int newWidth = (int)(height * windowAspect);
                        col1 = (width - newWidth)/2;
                        col2 = col1 + newWidth - 1;
                    }
                    hWindowControl1.HalconWindow.SetPart(row1, col1, row2, col2);
                    IntPtr imagePtr = image.PixelDataPtr;

                    Console.WriteLine(image.PixelType);
                    if (image.PixelType == MvGvspPixelType.PixelType_Gvsp_BayerBG8)
                    {

                        HImage hImage = new HImage("byte",width,height,imagePtr);
                        HObject rgbImage;
                        HOperatorSet.CfaToRgb(hImage, out rgbImage, "bayer_bg", "bilinear");

                        HOperatorSet.DispObj(rgbImage, hWindowControl1.HalconWindow);
                        hImage.Dispose();
                        rgbImage.Dispose();
                    }
                    
                }

            }
        }
        private void bnStartGrab_Click(object sender, EventArgs e)
        {
            try
            {
                isGrabbing = true;
                pictureBoxHandle = displayArea.Handle;
                receiveThread = new Thread(ReciveThreadProcess);
                receiveThread.Start();

                receiveImage = new Thread(ReciveThreadImage);
                receiveImage.Start();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Start thread failed !" + ex.Message);
                return;
            }
            //开始采集
            int result = device.StreamGrabber.StartGrabbing();
            if (result != MvError.MV_OK)
            {
                isGrabbing = false;
                receiveThread.Join();
                ShowErrorMsg("Start Grabbing Fail !", result);
                return;
            }

            SetCtrlWhenStartGrab();
        }
        private void SetCtrlWhenStartGrab()
        {
            bnStartGrab.Enabled = false;
            bnStopGrab.Enabled = true;

            if ((bool)bnTriggerMode.Checked)
            {
                cbSoftTrigger.Enabled = true;
                if ((bool)cbSoftTrigger.Checked)
                {
                    bnTriggerExec.Enabled = true;
                }
            }
        }
    }
}

;