项目已更新到另一个工具,见这篇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;
}