如何用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,然后根据路径读取图片。
