Exemplo n.º 1
0
        /// <summary>
        /// 根据设备列表,初始化单个相机
        /// </summary>
        /// <param name="tCameraDevInfoList">相机设备列表</param>
        /// <param name="cameraDevID">第i个相机</param>
        /// <param name="PreviewBox">相机对应的PictureBox</param>
        /// <param name="CaptureThreadProc1">相机对应的线程处理函数</param>
        /// <param name="cameraObj">相机对象</param>
        /// <returns></returns>
        protected bool InitSingleCamera(tSdkCameraDevInfo[] tCameraDevInfoList, int cameraDevID,
                                        ThreadStart CaptureThreadProc1,
                                        PictureBox PreviewBox, Button BtnPlay, Label StateLabel,
                                        string errMsg,
                                        ref tpvCameraObj cameraObj)
        {
            if (MvApi.CameraInit(ref tCameraDevInfoList[cameraDevID], -1, -1, ref cameraObj.m_hCamera) == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
            {
                //获得相机特性描述
                MvApi.CameraGetCapability(cameraObj.m_hCamera, out cameraObj.tCameraCapability);

                cameraObj.m_ImageBuffer = Marshal.AllocHGlobal(cameraObj.tCameraCapability.sResolutionRange.iWidthMax *
                                                               cameraObj.tCameraCapability.sResolutionRange.iHeightMax * 3 + 1024);

                //初始化显示模块,使用SDK内部封装好的显示接口
                MvApi.CameraDisplayInit(cameraObj.m_hCamera, PreviewBox.Handle);
                MvApi.CameraSetDisplaySize(cameraObj.m_hCamera, PreviewBox.Width, PreviewBox.Height);

                //让SDK来根据相机的型号动态创建该相机的配置窗口。
                MvApi.CameraCreateSettingPage(cameraObj.m_hCamera, this.Handle, tCameraDevInfoList[cameraDevID].acFriendlyName,
                                              /*SettingPageMsgCalBack*/ null, /*m_iSettingPageMsgCallbackCtx*/ (IntPtr)null, 0);

                MvApi.CameraPlay(cameraObj.m_hCamera);
                BtnPlay.Text = "Pause";

                //两种方式来获得预览图像,设置回调函数或者使用定时器或者独立线程的方式,
                //主动调用CameraGetImageBuffer接口来抓图。
                //本例中仅演示了两种的方式,注意,两种方式也可以同时使用,但是在回调函数中,
                //不要使用CameraGetImageBuffer,否则会造成死锁现象。

                cameraObj.m_bExitCaptureThread = false;
                cameraObj.m_tCaptureThread     = new Thread(new ThreadStart(CaptureThreadProc1));
                cameraObj.m_tCaptureThread.Start();
            }
            else
            {
                cameraObj.m_hCamera = 0;
                //StateLabel.Text = "Camera 1 init error";
                StateLabel.Text = errMsg;
                return(false);
            }
            return(true);
        }
Exemplo n.º 2
0
        private bool InitCamera()
        {
            CameraSdkStatus status;

            tSdkCameraDevInfo[] tCameraDevInfoList;
            //IntPtr ptr;
            //int i;
#if USE_CALL_BACK
            CAMERA_SNAP_PROC pCaptureCallOld = null;
#endif
            if (m_hCamera > 0)
            {
                //已经初始化过,直接返回 true
                return(true);
            }

            status = MvApi.CameraEnumerateDevice(out tCameraDevInfoList);
            if (status == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
            {
                if (tCameraDevInfoList != null)//此时iCameraCounts返回了实际连接的相机个数。如果大于1,则初始化第一个相机
                {
                    status = MvApi.CameraInit(ref tCameraDevInfoList[0], -1, -1, ref m_hCamera);
                    if (status == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
                    {
                        //获得相机特性描述
                        MvApi.CameraGetCapability(m_hCamera, out tCameraCapability);

                        m_ImageBuffer         = Marshal.AllocHGlobal(tCameraCapability.sResolutionRange.iWidthMax * tCameraCapability.sResolutionRange.iHeightMax * 3 + 1024);
                        m_ImageBufferSnapshot = Marshal.AllocHGlobal(tCameraCapability.sResolutionRange.iWidthMax * tCameraCapability.sResolutionRange.iHeightMax * 3 + 1024);

                        //初始化显示模块,使用SDK内部封装好的显示接口
                        MvApi.CameraDisplayInit(m_hCamera, PreviewBox.Handle);
                        MvApi.CameraSetDisplaySize(m_hCamera, PreviewBox.Width, PreviewBox.Height);

                        //设置抓拍通道的分辨率。
                        tSdkImageResolution tResolution;
                        tResolution.uSkipMode       = 0;
                        tResolution.uBinAverageMode = 0;
                        tResolution.uBinSumMode     = 0;
                        tResolution.uResampleMask   = 0;
                        tResolution.iVOffsetFOV     = 0;
                        tResolution.iHOffsetFOV     = 0;
                        tResolution.iWidthFOV       = tCameraCapability.sResolutionRange.iWidthMax;
                        tResolution.iHeightFOV      = tCameraCapability.sResolutionRange.iHeightMax;
                        tResolution.iWidth          = tResolution.iWidthFOV;
                        tResolution.iHeight         = tResolution.iHeightFOV;
                        //tResolution.iIndex = 0xff;表示自定义分辨率,如果tResolution.iWidth和tResolution.iHeight
                        //定义为0,则表示跟随预览通道的分辨率进行抓拍。抓拍通道的分辨率可以动态更改。
                        //本例中将抓拍分辨率固定为最大分辨率。
                        tResolution.iIndex        = 0xff;
                        tResolution.acDescription = new byte[32];//描述信息可以不设置
                        tResolution.iWidthZoomHd  = 0;
                        tResolution.iHeightZoomHd = 0;
                        tResolution.iWidthZoomSw  = 0;
                        tResolution.iHeightZoomSw = 0;

                        MvApi.CameraSetResolutionForSnap(m_hCamera, ref tResolution);

                        //让SDK来根据相机的型号动态创建该相机的配置窗口。
                        MvApi.CameraCreateSettingPage(m_hCamera, this.Handle, tCameraDevInfoList[0].acFriendlyName, /*SettingPageMsgCalBack*/ null, /*m_iSettingPageMsgCallbackCtx*/ (IntPtr)null, 0);

                        //两种方式来获得预览图像,设置回调函数或者使用定时器或者独立线程的方式,
                        //主动调用CameraGetImageBuffer接口来抓图。
                        //本例中仅演示了两种的方式,注意,两种方式也可以同时使用,但是在回调函数中,
                        //不要使用CameraGetImageBuffer,否则会造成死锁现象。
            #if USE_CALL_BACK
                        m_CaptureCallback = new CAMERA_SNAP_PROC(ImageCaptureCallback);
                        MvApi.CameraSetCallbackFunction(m_hCamera, m_CaptureCallback, m_iCaptureCallbackCtx, ref pCaptureCallOld);
            #else //如果需要采用多线程,使用下面的方式
                        m_bExitCaptureThread = false;
                        m_tCaptureThread     = new Thread(new ThreadStart(CaptureThreadProc));
                        m_tCaptureThread.Start();
#endif
                        //MvApi.CameraReadSN 和 MvApi.CameraWriteSN 用于从相机中读写用户自定义的序列号或者其他数据,32个字节
                        //MvApi.CameraSaveUserData 和 MvApi.CameraLoadUserData用于从相机中读取自定义数据,512个字节
                        return(true);
                    }
                    else
                    {
                        m_hCamera       = 0;
                        StateLabel.Text = "Camera init error";
                        return(false);
                    }
                }
            }

            return(false);
        }
        private bool InitCamera()
        {
            tSdkCameraDevInfo[] tCameraDevInfoList = new tSdkCameraDevInfo[12];
            IntPtr ptr;
            int    i;

#if USE_CALL_BACK
            CAMERA_SNAP_PROC pCaptureCallOld = null;
#endif
            ptr = Marshal.AllocHGlobal(Marshal.SizeOf(new tSdkCameraDevInfo()) * 12);
            int iCameraCounts = 12;//如果有多个相机时,表示最大只获取最多12个相机的信息列表。该变量必须初始化,并且大于1
            if (m_hCamera > 0)
            {
                //已经初始化过,直接返回 true

                return(true);
            }
            if (MvApi.CameraEnumerateDevice(ptr, ref iCameraCounts) == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
            {
                for (i = 0; i < 12; i++)
                {
                    tCameraDevInfoList[i] = (tSdkCameraDevInfo)Marshal.PtrToStructure((IntPtr)((int)ptr + i * Marshal.SizeOf(new tSdkCameraDevInfo())), typeof(tSdkCameraDevInfo));
                }
                Marshal.FreeHGlobal(ptr);

                if (iCameraCounts >= 1)//此时iCameraCounts返回了实际连接的相机个数。如果大于1,则初始化第一个相机
                {
                    if (MvApi.CameraInit(ref tCameraDevInfoList[0], -1, -1, ref m_hCamera) == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
                    {
                        //获得相机特性描述
                        ptr = Marshal.AllocHGlobal(Marshal.SizeOf(new tSdkCameraCapbility()));
                        MvApi.CameraGetCapability(m_hCamera, ptr);
                        tCameraCapability = (tSdkCameraCapbility)Marshal.PtrToStructure(ptr, typeof(tSdkCameraCapbility));
                        Marshal.FreeHGlobal(ptr);
                        Marshal.FreeHGlobal(m_ImageBuffer);
                        m_ImageBuffer         = Marshal.AllocHGlobal(tCameraCapability.sResolutionRange.iWidthMax * tCameraCapability.sResolutionRange.iHeightMax * 3 + 1024);
                        m_ImageBufferSnapshot = Marshal.AllocHGlobal(tCameraCapability.sResolutionRange.iWidthMax * tCameraCapability.sResolutionRange.iHeightMax * 3 + 1024);

                        //初始化显示模块,使用SDK内部封装好的显示接口
                        MvApi.CameraDisplayInit(m_hCamera, pic_Image.Handle);
                        MvApi.CameraSetDisplaySize(m_hCamera, pic_Image.Width, pic_Image.Height);

                        //设置抓拍通道的分辨率。
                        tSdkImageResolution tResolution;
                        tResolution.fZoomScale = 1.0F;
                        tResolution.iVOffset   = 0;
                        tResolution.iHOffset   = 0;
                        tResolution.uBinMode   = 0;
                        tResolution.uSkipMode  = 0;
                        tResolution.iWidth     = tCameraCapability.sResolutionRange.iWidthMax;
                        tResolution.iHeight    = tCameraCapability.sResolutionRange.iHeightMax;
                        //tResolution.iIndex = 0xff;表示自定义分辨率,如果tResolution.iWidth和tResolution.iHeight
                        //定义为0,则表示跟随预览通道的分辨率进行抓拍。抓拍通道的分辨率可以动态更改。
                        //本例中将抓拍分辨率固定为最大分辨率。
                        tResolution.iIndex        = 0xff;
                        tResolution.acDescription = new byte[32];//描述信息可以不设置
                        MvApi.CameraSetResolutionForSnap(m_hCamera, ref tResolution);

                        //让SDK来根据相机的型号动态创建该相机的配置窗口。
                        MvApi.CameraCreateSettingPage(m_hCamera, this.Handle, tCameraDevInfoList[0].acFriendlyName, /*SettingPageMsgCalBack*/ null, /*m_iSettingPageMsgCallbackCtx*/ (IntPtr)null, 0);

                        //两种方式来获得预览图像,设置回调函数或者使用定时器或者独立线程的方式,
                        //主动调用CameraGetImageBuffer接口来抓图。
                        //本例中仅演示了两种的方式,注意,两种方式也可以同时使用,但是在回调函数中,
                        //不要使用CameraGetImageBuffer,否则会造成死锁现象。
#if USE_CALL_BACK
                        MvApi.CameraSetCallbackFunction(m_hCamera, ImageCaptureCallback, m_iCaptureCallbackCtx, ref pCaptureCallOld);
#else //如果需要采用多线程,使用下面的方式
                        m_bExitCaptureThread = false;
                        m_tCaptureThread     = new Thread(new ThreadStart(CaptureThreadProc));
                        m_tCaptureThread.Start();
#endif
                        return(true);
                    }
                    else
                    {
                        m_hCamera = 0;
                        //StateLabel.Text = "相机初始化失败";
                        return(false);
                    }
                }
            }

            return(false);
        }
Exemplo n.º 4
0
        private bool InitCamera()
        {
            CameraSdkStatus status;

            tSdkCameraDevInfo[] tCameraDevInfoList;

            status = MvApi.CameraEnumerateDevice(out tCameraDevInfoList);
            int iCameraCounts = (tCameraDevInfoList != null ? tCameraDevInfoList.Length : 0);

            if (iCameraCounts >= 2)//此时iCameraCounts返回了实际连接的相机个数。如果大于2,则初始化前2个相机
            {
                if (MvApi.CameraInit(ref tCameraDevInfoList[0], -1, -1, ref m_hCamera1) == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
                {
                    //获得相机特性描述
                    MvApi.CameraGetCapability(m_hCamera1, out tCameraCapability1);

                    m_ImageBuffer1 = Marshal.AllocHGlobal(tCameraCapability1.sResolutionRange.iWidthMax * tCameraCapability1.sResolutionRange.iHeightMax * 3 + 1024);

                    //初始化显示模块,使用SDK内部封装好的显示接口
                    MvApi.CameraDisplayInit(m_hCamera1, PreviewBox.Handle);
                    MvApi.CameraSetDisplaySize(m_hCamera1, PreviewBox.Width, PreviewBox.Height);

                    //让SDK来根据相机的型号动态创建该相机的配置窗口。
                    MvApi.CameraCreateSettingPage(m_hCamera1, this.Handle, tCameraDevInfoList[0].acFriendlyName, /*SettingPageMsgCalBack*/ null, /*m_iSettingPageMsgCallbackCtx*/ (IntPtr)null, 0);

                    MvApi.CameraPlay(m_hCamera1);
                    BtnPlay.Text = "Pause";

                    //两种方式来获得预览图像,设置回调函数或者使用定时器或者独立线程的方式,
                    //主动调用CameraGetImageBuffer接口来抓图。
                    //本例中仅演示了两种的方式,注意,两种方式也可以同时使用,但是在回调函数中,
                    //不要使用CameraGetImageBuffer,否则会造成死锁现象。

                    m_bExitCaptureThread1 = false;
                    m_tCaptureThread1     = new Thread(new ThreadStart(CaptureThreadProc1));
                    m_tCaptureThread1.Start();
                }
                else
                {
                    m_hCamera1      = 0;
                    StateLabel.Text = "Camera 1 init error";
                    return(false);
                }

                if (MvApi.CameraInit(ref tCameraDevInfoList[1], -1, -1, ref m_hCamera2) == CameraSdkStatus.CAMERA_STATUS_SUCCESS)
                {
                    //获得相机特性描述
                    MvApi.CameraGetCapability(m_hCamera2, out tCameraCapability2);

                    m_ImageBuffer2 = Marshal.AllocHGlobal(tCameraCapability2.sResolutionRange.iWidthMax * tCameraCapability2.sResolutionRange.iHeightMax * 3 + 1024);

                    //初始化显示模块,使用SDK内部封装好的显示接口
                    MvApi.CameraDisplayInit(m_hCamera2, PreviewBox2.Handle);
                    MvApi.CameraSetDisplaySize(m_hCamera2, PreviewBox2.Width, PreviewBox2.Height);

                    //让SDK来根据相机的型号动态创建该相机的配置窗口。
                    MvApi.CameraCreateSettingPage(m_hCamera2, this.Handle, tCameraDevInfoList[1].acFriendlyName, /*SettingPageMsgCalBack*/ null, /*m_iSettingPageMsgCallbackCtx*/ (IntPtr)null, 0);

                    MvApi.CameraPlay(m_hCamera2);
                    BtnPlay2.Text = "Pause";

                    m_bExitCaptureThread2 = false;
                    m_tCaptureThread2     = new Thread(new ThreadStart(CaptureThreadProc2));
                    m_tCaptureThread2.Start();
                }
                else
                {
                    m_hCamera2      = 0;
                    StateLabel.Text = "Camera 2 init error";
                    return(false);
                }

                return(true);
            }
            return(false);
        }