qq_27049053 2024-12-23 07:29 采纳率: 0%
浏览 23

海康工业相机、SDK、图像

海康工业相机通过SDK回调图像
海康工业相机通过MvCameraControl.Net.dll文件,在FrameGrabbedEventArgs图像抓取事件中回调图像, e.FrameOut.Image.ToBitmap回调不到图像,返回值位空,求解?

  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-23 07:33
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    ### 问题描述 在使用海康工业相机的SDK(通过MvCameraControl.Net.dll)进行图像抓取时,遇到FrameGrabbedEventArgs事件中回调图像为空的问题。具体表现为`e.FrameOut.Image.ToBitmap()`返回空值。

    解决方案

    1. 检查初始化和配置

    确保你的相机已经正确初始化并且配置了正确的参数。以下是一些基本步骤:

    • 加载库文件:确认MvCameraControl.Net.dll已被正确引用。
    • 创建设备句柄:使用MvCamera.CreateHandle方法获取相机设备的句柄。
    • 打开设备:调用MvCamera.OpenDevice方法来打开相机。
    • 设置触发模式:根据需要设置相机为自由运行或外部触发模式。
    • 开始采集:使用MvCamera.StartGrabbing启动图像采集过程。

    2. 确认数据流格式

    确保从相机接收的数据格式与你尝试转换成位图的格式兼容。如果直接转换失败,可能是因为原始数据不是标准的RGB格式。可以通过检查FrameOut.PixelFormat属性来确定实际使用的像素格式,并据此选择合适的转换方法。

    3. 调整内存管理

    有时,由于内存分配不足或不当,可能导致图像数据未能被正确读取。可以尝试增加缓冲区大小或者调整其他相关参数。

    4. 示例代码

    下面提供了一个简单的C#示例,展示如何设置并捕获图像。请注意,此代码仅供参考,具体实现可能需根据实际情况调整。

    using System;
    using MvCameraControl;
    
    public class CameraCaptureExample
    {
        private MvCamera _camera;
        private string _deviceIP = "192.168.0.1"; // 替换为实际设备IP
    
        public void Start()
        {
            _camera = new MvCamera();
            
            // 创建设备句柄
            int nRet = _camera.MV_CC_CreateHandle(_deviceIP);
            if (nRet != 0)
            {
                Console.WriteLine("Failed to create handle.");
                return;
            }
    
            // 打开设备
            nRet = _camera.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0);
            if (nRet != 0)
            {
                Console.WriteLine("Failed to open device.");
                return;
            }
    
            // 开始抓图
            _camera.FrameGrabbed += OnFrameGrabbed;
            nRet = _camera.MV_CC_StartGrabbing();
            if (nRet != 0)
            {
                Console.WriteLine("Failed to start grabbing.");
                return;
            }
        }
    
        private void OnFrameGrabbed(object sender, FrameGrabbedEventArgs e)
        {
            if (e.FrameOut.Image == null || e.FrameOut.Image.IsEmpty)
            {
                Console.WriteLine("Image is empty or null.");
                return;
            }
    
            try
            {
                var bitmap = e.FrameOut.Image.ToBitmap();
                // 在这里处理bitmap对象
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error converting to bitmap: {ex.Message}");
            }
        }
    
        public void Stop()
        {
            _camera.StopGrabbing();
            _camera.CloseDevice();
            _camera.DestroyHandle();
        }
    }
    

    5. 错误排查

    • 如果上述步骤后仍然无法获得图像,请检查是否有异常抛出。
    • 查看日志输出以获取更多错误信息。
    • 尝试降低分辨率或帧率以减轻系统负担。
    • 确保网络连接稳定且没有丢包现象。

    希望以上建议能帮助您解决问题!如果还有其他疑问或需要进一步的帮助,请随时告知。

    展开全部

    评论
    qq_27049053 2025-01-05 05:07

    bitmap = e.FrameOut.Image.ToBitmap() 就是这样做的,返回值还是空的

    回复
    qq_27049053 2025-01-05 05:08

    看了一下bitmap = e.FrameOut.Image是有数据的但是转Bitmap就是空的了

    回复
  • Rotion_深 2025-01-22 02:27
    关注

    问题描述 在使用海康工业相机的SDK(通过MvCameraControl.Net.dll)进行图像抓取时,遇到FrameGrabbedEventArgs事件中回调图像为空的问题。具体表现为e.FrameOut.Image.ToBitmap()返回空值。

    解决方案
    前提是保证相机的连接,触发等没有问题的情况下,可以换个思路获取图像。
    以下是使用线程来处理BMP图像的思路,可以提供参考。

    1.可以尝试使用线程循环去获取回调中的图像数据
    2.调用开始采集方法之前,启动线程
    3.线程中将BMp的数据保存下来,通过委托等方式可以传至控件显示等

    
    ```c#
    
    
    
            //定义线程以及处理回调数据的对象
            bool m_bGrabbing = false;
            Thread m_hReceiveThread;
            UInt32 m_nBufSizeForDriver = 0;
            IntPtr m_BufForDriver;
            private static Object BufForDriverLock = new Object();
    
    
            /// <summary>
            /// 相机开始采集
            /// </summary>
            /// <returns></returns>
            public BaseResult StartCamera()
            {
                //采集标识
                m_bGrabbing = true;
    
                //收集回调数据的处理线程
                m_hReceiveThread = new Thread(ReceiveThreadProcess);
                m_hReceiveThread.Start();
    
                m_stFrameInfo.nFrameLen = 0;//取流之前先清除帧长度
                m_stFrameInfo.enPixelType = MyCamera.MvGvspPixelType.PixelType_Gvsp_Undefined;
                // ch:开始采集 | en:Start Grabbing
                int nRet = myCamera.MV_CC_StartGrabbing_NET();
                if (MyCamera.MV_OK != nRet)
                {
                    m_bGrabbing = false;
                    m_hReceiveThread.Join();
                    return BaseResult.Failed;
                }
    
                return BaseResult.Successed;
            }
    
            /// <summary>
            /// 停止相机采集
            /// </summary>
            /// <returns></returns>
            public BaseResult StopCamera()
            {
                m_bGrabbing = false;
                m_hReceiveThread?.Join();
    
                if (myCamera == null)
                    return BaseResult.Successed;
                int temp = myCamera.MV_CC_StopGrabbing_NET();
                if (MyCamera.MV_OK != temp)
                    return BaseResult.Failed;
                return BaseResult.Successed;
            }
            
            
            /// <summary>
            /// 获取图像的回调线程
            /// </summary>
            private void ReceiveThreadProcess()
            {
                MyCamera.MVCC_INTVALUE stParam = new MyCamera.MVCC_INTVALUE();
                int nRet = myCamera.MV_CC_GetIntValue_NET("PayloadSize", ref stParam);
                if (MyCamera.MV_OK != nRet)
                {
                    return;
                }
    
                UInt32 nPayloadSize = stParam.nCurValue;
                if (nPayloadSize > m_nBufSizeForDriver)
                {
                    if (m_BufForDriver != IntPtr.Zero)
                    {
                        Marshal.Release(m_BufForDriver);
                    }
                    m_nBufSizeForDriver = nPayloadSize;
                    m_BufForDriver = Marshal.AllocHGlobal((Int32)m_nBufSizeForDriver);
                }
    
                if (m_BufForDriver == IntPtr.Zero)
                {
                    return;
                }
    
                MyCamera.MV_FRAME_OUT_INFO_EX stFrameInfo = new MyCamera.MV_FRAME_OUT_INFO_EX();
                MyCamera.MV_DISPLAY_FRAME_INFO stDisplayInfo = new MyCamera.MV_DISPLAY_FRAME_INFO();
    
                while (m_bGrabbing)
                {
                    try
                    {
                        lock (BufForDriverLock)
                        {
                            nRet = myCamera.MV_CC_GetOneFrameTimeout_NET(m_BufForDriver, nPayloadSize, ref stFrameInfo, 1000);
                            if (nRet == MyCamera.MV_OK)
                            {
                                m_stFrameInfo = stFrameInfo;
                            }
                        }
    
                        if (nRet == MyCamera.MV_OK)
                        {
                            if (RemoveCustomPixelFormats(stFrameInfo.enPixelType))
                            {
                                continue;
                            }
                            if (image_handle != IntPtr.Zero)
                            {
                                stDisplayInfo.hWnd = image_handle;
                            }
                            stDisplayInfo.pData = m_BufForDriver;
                            stDisplayInfo.nDataLen = stFrameInfo.nFrameLen;
                            stDisplayInfo.nWidth = stFrameInfo.nWidth;
                            stDisplayInfo.nHeight = stFrameInfo.nHeight;
                            stDisplayInfo.enPixelType = stFrameInfo.enPixelType;
                            myCamera.MV_CC_DisplayOneFrame_NET(ref stDisplayInfo);
    
                            Bitmap bmp = null;
                            if (stDisplayInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
                            {
                                //Mono8 转 Bitmap
                                bmp = new Bitmap(m_stFrameInfo.nWidth, m_stFrameInfo.nHeight, m_stFrameInfo.nWidth * 1, PixelFormat.Format8bppIndexed, stDisplayInfo.pData);
    
                                ColorPalette cp = bmp.Palette;
                                for (int i = 0; i < 256; i++)
                                {
                                    cp.Entries[i] = Color.FromArgb(i, i, i);
                                }
                                bmp.Palette = cp;
                                //bmp.Save("image.bmp", ImageFormat.Bmp);
                            }
                            else
                            {
                                //BGR8 转 Bitmap
                                try
                                {
                                    bmp = new Bitmap(m_stFrameInfo.nWidth, m_stFrameInfo.nHeight, m_stFrameInfo.nWidth * 3, PixelFormat.Format24bppRgb, stDisplayInfo.pData);
                                    //bmp.Save("image.bmp", ImageFormat.Bmp);
                                }
                                catch
                                {
                                    bmp = null;
                                }
                            }
                            if (bmp != null)
                                OnReceiveImage?.Invoke(bmp);
                        }
                        else
                        {
                            Thread.Sleep(5);
                        }
                    }
                    catch (Exception ex)
                    {
    
                    }
                    finally
                    {
                        Thread.Sleep(0);
                    }
                }
            }
    
    
            /// <summary>
            /// 去除自定义的像素格式 
            /// </summary>
            /// <param name="enPixelFormat"></param>
            /// <returns></returns>
            private bool RemoveCustomPixelFormats(MyCamera.MvGvspPixelType enPixelFormat)
            {
                Int32 nResult = ((int)enPixelFormat) & (unchecked((Int32)0x80000000));
                if (0x80000000 == nResult)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 判断是否为黑白图像
            /// </summary>
            /// <param name="enGvspPixelType"></param>
            /// <returns></returns>
            private Boolean IsMonoData(MyCamera.MvGvspPixelType enGvspPixelType)
            {
                switch (enGvspPixelType)
                {
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono10_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono12_Packed:
                        return true;
                    default:
                        return false;
                }
            }
    
            /// <summary>
            /// 判断是否彩色照片
            /// </summary>
            /// <param name="enGvspPixelType"></param>
            /// <returns></returns>
            private Boolean IsColorData(MyCamera.MvGvspPixelType enGvspPixelType)
            {
                switch (enGvspPixelType)
                {
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR8:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG8:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB8:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG8:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR10_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG10_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB10_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG10_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGR12_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerRG12_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerGB12_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_BayerBG12_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_YUV422_YUYV_Packed:
                    case MyCamera.MvGvspPixelType.PixelType_Gvsp_YCBCR411_8_CBYYCRYY:
                        return true;
    
                    default:
                        return false;
                }
            }
    
    
    
    

    展开全部

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部