使用海康威视SDK(MVS)&Basler.Pylon读取GigE相机到opencvsharp的Mat类型

项目已更新到另一个工具,见这篇https://blog.youkuaiyun.com/tfarcraw/article/details/108028209
最近想做一个基于opencvsharp的视觉软件,当然第一步是从相机采图开始了,先测试了海康的sdk,
他们家有一个虚拟相机,没有相机也可以测试,挺方便的。在这里插入图片描述

这个项目我会开源在我的码云上,有兴趣的同学可以去看看,链接见文末,
主要用到了Prism MVVM框架,当然还有opencvsharp,
先贴一些核心代码,MVS:

 //Trigger
nRet = CameraList[index].MV_CC_SetCommandValue_NET("TriggerSoftware");

if (nRet != MyCamera.MV_OK) ShowErrorMsg("TriggerSoftware", nRet);

	MyCamera.MV_FRAME_OUT FrameInfo = new();
    do
    {
         _ = CameraList[index].MV_CC_GetImageBuffer_NET(ref FrameInfo, 1);
    }
    while (FrameInfo.pBufAddr == IntPtr.Zero);

 // 转Mat

var h = FrameInfo.stFrameInfo.nHeight;
var w = FrameInfo.stFrameInfo.nWidth;
if (IsMonoData(FrameInfo.stFrameInfo.enPixelType))
{
   mat = new Mat(h, w, MatType.CV_8U, FrameInfo.pBufAddr);
}
else if (FrameInfo.stFrameInfo.enPixelType == MyCamera.MvGvspPixelType.PixelType_Gvsp_BGR8_Packed)
{
   mat = new Mat(h, w, MatType.CV_8UC3, FrameInfo.pBufAddr);
}

Basler.Pylon:

        public async Task<Mat> GetOneImage(string ip, int exposureTime, Rect rect)
        {
            exposureTime = exposureTime < 35 ? 35 : exposureTime;
            exposureTime = exposureTime > 999985 ? 999985 : exposureTime;

            Mat mat = null;

            //Camera mCamera = allCameras.Where(c => c.CameraInfo[CameraInfoKey.DeviceIpAddress] == ip).FirstOrDefault();
            Camera mCamera = CameraList[ip];
            if (!mCamera.IsOpen)
            {
                try
                {
                    mCamera.Open();
                    mCamera.Parameters[PLCameraInstance.MaxNumBuffer].SetValue(1);
                    mCamera.Parameters[PLTransportLayer.HeartbeatTimeout]
                        .TrySetValue(1000, IntegerValueCorrection.Nearest);  // 1000 ms timeout
                }
                catch (Exception ex)
                {
                    ErrorMessage?.Invoke($"Error: {ex.Message}");
                    goto fail;
                }
            }

            //设置要在采集之前
            mCamera.Parameters[PLCamera.ExposureAuto].SetValue("Off");  //自动曝光关
            mCamera.Parameters[PLCamera.ExposureTimeAbs].SetValue(exposureTime);
            //AOI set
            var maxwidth = mCamera.Parameters[PLCamera.WidthMax].GetValue();
            var maxHeight = mCamera.Parameters[PLCamera.HeightMax].GetValue();

            System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
            //Grab
            if (!mCamera.StreamGrabber.IsGrabbing)
                mCamera.StreamGrabber.Start(1);
            else
                goto fail;

            IGrabResult grabResult = mCamera.StreamGrabber.RetrieveResult(5000, TimeoutHandling.Return);

            if (grabResult is null)
            {
                goto fail;
            }

            if (grabResult.GrabSucceeded)

            {
                // 转Mat
                var h = grabResult.Height;
                var w = grabResult.Width;
                mat = new Mat(h, w, MatType.CV_8UC1, grabResult.PixelDataPointer);
            }
            else

            {
                ErrorMessage?.Invoke($"Error: {grabResult.ErrorCode} {grabResult.ErrorDescription}");
                goto fail;
            }
            sw.Stop();
            System.Diagnostics.Debug.WriteLine(sw.ElapsedMilliseconds + "ms");
            return mat;

            fail:
            await Task.Delay(100);
            return mat;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易极

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值