如何用OpenCVSharp实现ArUco标记检测及透视变换?

摘要:前言 对于.NET开发者而言,入门OpenCV的一个很舒适的方式就是先去使用OpenCVSharp,它是 OpenCV 的 .NET 封装,而且作者还开源了一个示例库,可以通过示例库进行入门学习。 OpenCVSharp仓库地址:https
前言 对于.NET开发者而言,入门OpenCV的一个很舒适的方式就是先去使用OpenCVSharp,它是 OpenCV 的 .NET 封装,而且作者还开源了一个示例库,可以通过示例库进行入门学习。 OpenCVSharp仓库地址:https://github.com/shimat/opencvsharp opencvsharp_samples仓库地址:https://github.com/shimat/opencvsharp_samples 作者提供了几十个可以直接运行的示例代码,一开始可以先大概运行一下这些示例,看一下用这个库可以实现哪些功能。 入门第一步就是先学会用,那些视觉算法的原理可以先不懂,大概了解一下就够了,等后面真的需要你深入了解的时候再去了解也不迟,现在深入理解原理容易让小白放弃,刚开始入门我们就当一名踏踏实实的“掉包侠”。 Aruco 标记检测与透视变换 第一个例子是关于Aruco 标记检测和透视变换的。 第一步先运行起来,看一下实现了什么效果? 首先原图是这样的: 注意到上面有4个有点奇怪的四边形。 然后识别这几个四边形的区域: 然后再进行一下透视变换: 刚刚看到的这些四边形就是Aruco标记,它是拿来干嘛的呢?我的简单理解就是拿来标记用的,一个经典的应用就是替换相框中的图片。 OpenCVSharp好像还没有提供生成Aruco标记的功能,但是已经有了识别的功能,让我们看看这个效果是如何实现的吧!! // The locations of the markers in the image at FilePath.Image.Aruco. const int upperLeftMarkerId = 160; const int upperRightMarkerId = 268; const int lowerRightMarkerId = 176; const int lowerLeftMarkerId = 168; using var src = Cv2.ImRead(ImagePath); var detectorParameters = new DetectorParameters(); detectorParameters.CornerRefinementMethod = CornerRefineMethod.Subpix; detectorParameters.CornerRefinementWinSize = 9; using var dictionary = CvAruco.GetPredefinedDictionary(PredefinedDictionaryName.Dict4X4_1000); CvAruco.DetectMarkers(src, dictionary, out var corners, out var ids, detectorParameters, out var rejectedPoints); 每个Aruco标记都有一个确定的ID,然后根据路径读取图片。
阅读全文