/// <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); }
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); }
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); }