gpt4 book ai didi

c# - 如何使用 FindChessboardCorners

转载 作者:太空狗 更新时间:2023-10-29 23:14:09 45 4
gpt4 key购买 nike

我正在使用新的 EmguCV 3.0.0 alpha 来检测带有网络摄像头的棋盘,并且对角矩阵有理解问题。

        Size patternSize = new Size(5, 4);
Matrix<float> corners = new Matrix<float>(1, 2);

bool find = CvInvoke.FindChessboardCorners(grayFrame, patternSize, corners, CalibCbType.AdaptiveThresh | CalibCbType.FilterQuads);
CvInvoke.DrawChessboardCorners(grayFrame, patternSize, corners, find);
if (find)
{
Console.Write(corners.Size);
}

棋盘将被检测并正确显示!

但是,角点矩阵的大小必须有多大,我该如何提取角点位置?

我在互联网上找到的所有样本都使用旧版本的 EmguCV,现在有一个完全不同的语法。我会使用旧版本,但较新的 alpha 版本要快得多,而且时间是我应用程序中的一个大问题。

最佳答案

CvInvoke.FindChessboardCorners Method有这个签名1:

public static bool FindChessboardCorners(
IInputArray image,
Size patternSize,
IOutputArray corners,
CalibCbType flags = CalibCbType.Default|CalibCbType.AdaptiveThresh|CalibCbType.NormalizeImage
)

第三个参数的类型是IOutputArray 2。我不明白他们为什么要引入这些由各种不能互换使用的类实现的 super 通用输入/输出接口(interface)。

你是对的,Matrix类确实实现了该接口(interface)(通过父类(super class) CvArray ),因此您的代码可以编译。但是,CvInvoke.FindChessboardCorners 应该返回几个点(取决于模式的大小)。我在谷歌上搜索了实现 IOutputArray 的类并找到了 VectorOfPoints .这对我来说很有意义,比使用 Matrix 更有意义。

我拼凑了一个用于校准的小控制台应用程序,它从目录中读取所有图像文件并检测其中的角点,因为对我来说,预先捕获图像更有意义。

这应该给你一个起点:

public class Calibration
{
static void Main(string[] args)
{
// chessboard pattern size
Size patternSize = new Size(9, 7);

// for each image, have one Image object and one VectorOfPoints
// for many images have a List of each
List<VectorOfPoint> corners = new List<VectorOfPoint>();
List<Image<Gray, Byte>> images = new List<Image<Gray, byte>>();

// get paths to image files
string[] imageFiles = Directory.GetFiles(@"C:\your\directory", "*.jpg");

// for every image
foreach (string imageFile in imageFiles)
{
// create new image object from file path
var image = new Image<Gray, byte>(imageFile);
images.Add(image);

// create new list of corner points
var cornerPoints = new VectorOfPoint();
corners.Add(cornerPoints);

// find chessboard corners
bool result = CvInvoke.FindChessboardCorners(image, patternSize, cornerPoints);

// some debug output
Console.WriteLine("=== " + Path.GetFileName(imageFile) + " === " + result);

if (!result)
{
continue;
}

// list points
foreach (Point cornerPoint in cornerPoints.ToArray())
{
Console.WriteLine(cornerPoint.X + ", " + cornerPoint.Y);
}
}

Console.ReadLine();
}
}

出于某种原因,我无法让 CvInvoke.DrawChessboardCorners 执行。它没有在合理的时间内完成函数的执行。这就是我将结果打印到 Console 的原因,这对我来说是这样的:

enter image description here

我在图像编辑器中目视验证了一些,它们似乎是正确的。

tl;dr

选择一个可以表示点列表并实现IOutputArray(例如VectorOfPoints)的适当类型。


1 有人说返回类型不包含在签名中,所以称上面的签名可能完全是胡说八道,但当我说“签名”。

2 现在这是一些有用的文档!

关于c# - 如何使用 FindChessboardCorners,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29557197/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com