/// <summary> /// <para>/****************************************************************************</para> /// <para> * @fn GetOneFrame</para> /// <para> * @brief 获取一帧图像数据</para> /// <para> * @param pData IN-OUT 数据数组指针</para> /// <para> * @param pnDataLen IN 数据大小</para> /// <para> * @param nDataSize IN 数组缓存大小</para> /// <para> * @param pFrameInfo OUT 数据信息</para> /// <para> * @return 成功:0;错误:-1</para> /// <para> ****************************************************************************/</para> /// </summary> public int GetOneFrame(IntPtr pData, ref UInt32 pnDataLen, UInt32 nDataSize, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo) { int nRet = m_pCSI.MV_CC_GetOneFrame_NET(pData, nDataSize, ref pFrameInfo); pnDataLen = pFrameInfo.nFrameLen; if (MyCamera.MV_OK != nRet) { return(nRet); } return(nRet); }
private void SaveImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo, IntPtr pUser) { try { if (ignoreImage) { return; } //HTuple startTime; HOperatorSet.CountSeconds(out startTime); // Reduce the number of displayed images to a reasonable amount if the camera is acquiring images very fast. //if (!stopWatch.IsRunning || stopWatch.ElapsedMilliseconds > 10) { //stopWatch.Restart(); //if (hPylonImage != null && hPylonImage.IsInitialized()) //{ // hPylonImage.Dispose(); //} hPylonImage = new HImage(); if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8) { hPylonImage.GenImage1("byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pData); } else if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) { hPylonImage.GenImageInterleaved(pData, "rgb", pFrameInfo.nWidth, pFrameInfo.nHeight, -1, "byte", pFrameInfo.nWidth, pFrameInfo.nHeight, 0, 0, -1, 0); } else { Util.Notify(string.Format("相机{0}编码格式不正确,当前格式{1}", cameraIndex, pFrameInfo.enPixelType)); } TrigerImageEvent(); } } catch (System.ArgumentException ex) { Util.WriteLog(this.GetType(), ex); Util.Notify(string.Format("相机{0}图像数据包丢失", cameraIndex)); } catch (Exception ex) { Util.WriteLog(this.GetType(), ex); Util.Notify(string.Format("相机{0}图像数据返回出现异常", cameraIndex)); } }
private void ImageOut(IntPtr pixelPointer, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo, IntPtr pUser) { try { MyCamera.MV_SAVE_IMAGE_PARAM_EX stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM_EX(); stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp; stSaveParam.enPixelType = pFrameInfo.enPixelType; stSaveParam.pData = pixelPointer; stSaveParam.nDataLen = pFrameInfo.nFrameLen; stSaveParam.nHeight = pFrameInfo.nHeight; stSaveParam.nWidth = pFrameInfo.nWidth; stSaveParam.pImageBuffer = pBufForSave; stSaveParam.nBufferSize = nSaveSize; stSaveParam.nJpgQuality = 80; if (MyCamera.MV_OK != m_pOperator.SaveImage(ref stSaveParam)) { return; } //byte[] image = new byte[stSaveParam.nImageLen]; //Marshal.Copy(pBufForSave, image, 0, (int)stSaveParam.nImageLen); //FileStream file = new FileStream("image.bmp", FileMode.Create, FileAccess.Write); //file.Write(image, 0, (int)stSaveParam.nImageLen); //file.Close(); //Stopwatch sw = new Stopwatch(); //sw.Start(); //图像压缩 HImage hImage = new HImage("byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pixelPointer); HImage hNewImage = hImage.ZoomImageFactor(0.25, 0.25, "constant"); //4倍 Bitmap bImage = GenertateGrayBitmap(hNewImage); //bImage.Save("image.bmp"); byte[] image = GlobalFunction.ImageToBytes(bImage); //sw.Stop(); //TimeSpan ts2 = sw.Elapsed; //string info = "压缩总共花费" + ts2.TotalMilliseconds.ToString() + "ms."; //LogHelper.AppLoger.Info(info); ThrowImage(image); } catch { if (IsGrabEnd == false) { m_pOperator.StopGrabbing(); IsGrabEnd = true; } m_pOperator.Close(); } }
/**************************************************************************** * @fn GetOneFrame * @brief 获取一帧图像数据 * @param pData IN-OUT 数据数组指针 * @param pnDataLen IN 数据大小 * @param nDataSize IN 数组缓存大小 * @param pFrameInfo OUT 数据信息 * @return 成功:0;错误:-1 ****************************************************************************/ public int GetOneFrame(IntPtr pData, ref UInt32 pnDataLen, UInt32 nDataSize, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo) { pnDataLen = 0; int nRet = m_pCSI.MV_CC_GetOneFrame_NET(pData, nDataSize, ref pFrameInfo); if (MyCamera.MV_OK != nRet) { return(CO_FAIL); } pnDataLen = (uint)(pFrameInfo.nWidth * pFrameInfo.nWidth * (((((UInt32)pFrameInfo.enPixelType) >> 16) & 0xffff) >> 3)); return(CO_OK); }
private void SaveImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo, IntPtr pUser) { try { if (ignoreImage) { return; } //HTuple startTime; if (Command != Command.Grab) { HOperatorSet.CountSeconds(out startTime); } hPylonImage = new HImage(); if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8) { hPylonImage.GenImage1("byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pData); } else if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) { hPylonImage.GenImageInterleaved(pData, "rgb", pFrameInfo.nWidth, pFrameInfo.nHeight, -1, "byte", pFrameInfo.nWidth, pFrameInfo.nHeight, 0, 0, -1, 0); } else { Util.Notify(string.Format("相机{0}编码格式不正确,当前格式{1}", cameraIndex, pFrameInfo.enPixelType)); } TrigerImageEvent(); } catch (System.ArgumentException ex) { Util.WriteLog(this.GetType(), ex); Util.Notify(string.Format("相机{0}图像数据包丢失", cameraIndex)); } catch (Exception ex) { Util.WriteLog(this.GetType(), ex); Util.Notify(string.Format("相机{0}图像数据返回出现异常", cameraIndex)); } }
/// <summary> /// 取图 /// </summary> public void OnMVImageReadyEventCallback() { lock (obj) { try { byte[] buffer = new byte[SizeMax.Width * SizeMax.Height * 3]; IntPtr pData = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); uint nDataLen = 0; var stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO(); // stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX(); //超时获取一帧,超时时间为1秒 var nRet = GetOneFrame(pData, ref nDataLen, (uint)SizeMax.Width * (uint)SizeMax.Height * 3, ref stFrameInfo); // nRet = GetImageBGR(pData, (uint)SizeMax.Width * (uint)SizeMax.Height * 3, ref stFrameInfo); if (MyCamera.MV_OK == nRet) { if (m_bitmap != null) { /* Update the bitmap with the image data. */ UpdateBitmap(m_bitmap, buffer, stFrameInfo.nWidth, stFrameInfo.nHeight, false); /* To show the new image, request the display control to update itself. */ } else /* A new bitmap is required. */ { CreateBitmap(ref m_bitmap, stFrameInfo.nWidth, stFrameInfo.nHeight, false); UpdateBitmap(m_bitmap, buffer, stFrameInfo.nWidth, stFrameInfo.nHeight, false); //* Provide the display control with the new bitmap. This action automatically updates the display. */ } bitmapInfo.Bitmap = (Bitmap)m_bitmap.Clone(); ImageReady?.Invoke(bitmapInfo); } } catch (Exception ex) { log.Error(ex); } } }
//回调函数 private void SaveImageCallBack(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo, IntPtr pUser) { DateTime dataTime1 = DateTime.Now; if ((3 * pFrameInfo.nFrameLen + 2048) > m_nBufSizeForSaveImage) { m_nBufSizeForSaveImage = 3 * pFrameInfo.nFrameLen + 2048; m_pBufForSaveImage = new byte[m_nBufSizeForSaveImage]; } IntPtr pImage = Marshal.UnsafeAddrOfPinnedArrayElement(m_pBufForSaveImage, 0); MyCamera.MV_SAVE_IMAGE_PARAM stSaveParam = new MyCamera.MV_SAVE_IMAGE_PARAM(); stSaveParam.enImageType = MyCamera.MV_SAVE_IAMGE_TYPE.MV_Image_Bmp; stSaveParam.enPixelType = pFrameInfo.enPixelType; stSaveParam.pData = pData; stSaveParam.nDataLen = pFrameInfo.nFrameLen; stSaveParam.nHeight = pFrameInfo.nHeight; stSaveParam.nWidth = pFrameInfo.nWidth; stSaveParam.pImageBuffer = pImage; stSaveParam.nBufferSize = m_nBufSizeForSaveImage; stSaveParam.nImageLen = 0; int nRet = m_pOperator.SaveImage(ref stSaveParam); MemoryStream ms = new MemoryStream(); //新建内存流 ms.Write(m_pBufForSaveImage, 0, (int)stSaveParam.nImageLen); //附值 this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart) delegate() { image_Camera.Source = imageSourceConverter.ConvertFrom(ms) as BitmapFrame; GC.Collect(); //强制回收资源 } ); Thread.Sleep(500); //这个延时可以让UI的响应更为流畅,但是图片的刷新较慢,打印的事件lTime在40ms内 }
private void SaveImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO pFrameInfo, IntPtr pUser) { try { if (ignoreImage) { return; } //HTuple startTime; // HOperatorSet.CountSeconds(out startTime); // Reduce the number of displayed images to a reasonable amount if the camera is acquiring images very fast. //if (!stopWatch.IsRunning || stopWatch.ElapsedMilliseconds > 10) { //stopWatch.Restart(); //if (hPylonImage != null && hPylonImage.IsInitialized()) //{ // hPylonImage.Dispose(); //} hPylonImage = new Cognex.VisionPro.CogImage8Grey(); if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8) { //hPylonImage.GenImage1("byte", pFrameInfo.nWidth, pFrameInfo.nHeight, pData); var cogRoot = new Cognex.VisionPro.CogImage8Root(); uint buffersize = new uint(); // m_pOperator.GetIntValue("PayloadSize",ref buffersize); //byte[] ImagebufferPtr = new byte[pFrameInfo.nWidth * pFrameInfo.nHeight]; //var pBufForDriver = Marshal.AllocHGlobal((Int32)(buffersize)); //Marshal.Copy(pBufForDriver, ImagebufferPtr, 0, pFrameInfo.nWidth * pFrameInfo.nHeight - 1); cogRoot.Initialize(pFrameInfo.nWidth, pFrameInfo.nHeight, pData, pFrameInfo.nWidth, null); hPylonImage.SetRoot(cogRoot); GC.Collect(); //Marshal.FreeHGlobal(pBufForDriver); /* * MyCamera.MV_FRAME_OUT info = new MyCamera.MV_FRAME_OUT(); * var stDevInfo = (MyCamera.MV_FRAME_OUT)Marshal.PtrToStructure(stDevList.pDeviceInfo[0], typeof(MyCamera.MV_FRAME_OUT));*/ } else if (pFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) {/* * hPylonImage.GenImageInterleaved(pData, * "rgb", * pFrameInfo.nWidth, pFrameInfo.nHeight, * -1, "byte", * pFrameInfo.nWidth, pFrameInfo.nHeight, * 0, 0, -1, 0);*/ } else {/* * Util.Notify(string.Format("相机{0}编码格式不正确,当前格式{1}", cameraIndex, pFrameInfo.enPixelType));*/ } TrigerImageEvent(); } } catch (System.ArgumentException ex) {/* * Util.WriteLog(this.GetType(), ex); * Util.Notify(string.Format("相机{0}图像数据包丢失", cameraIndex));*/ } catch (Exception ex) {/* * Util.WriteLog(this.GetType(), ex); * Util.Notify(string.Format("相机{0}图像数据返回出现异常", cameraIndex));*/ } }