- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 OpenCVSharp 运行一些校准测试,但我似乎无法让 FindCirclesGrid 工作,我在调用 FindCirclesGrid 时遇到了一个非常意外的 AccessViolationException。
我不确定我可能做错了什么,因为前两行与样本中的几乎完全一样,中心没有初始化,因为它是一个输出参数,传递给 OpenCV 的所有内容似乎都在初始化OpenCVSharp 的封装函数。
void test()
{
Mat im = Cv2.ImRead(@"path_to_my_file.jpg");
Size patternsize = new Size(11, 4);
Point2f[] centers;
var f = Cv2.FindCirclesGrid(im, patternsize, out centers, FindCirclesGridFlag.AsymmetricGrid);
}
我正在使用直接来自 nuget 的最新 OpenCVSharp
Edit1 :我忘了在问题中提到这一点,但我已经尝试在 FindCirclesGrid 之后添加 foillowing 以确保对象在应该收集之前没有被错误地收集,这没有任何改变。此外,该错误在调试和发布中发生的情况相同。
Console.Writeline(im.ToString());
Console.Writeline(patternsize.ToString());
Console.Writeline(centers.ToString());
Console.Writeline(f.ToString());
最佳答案
这was a bug in OpenCvSharp ,我提交了包含在 NuGet 版本 2.4.10.20150604 中的修复。
C++ 包装器 dll 导出了两个互操作调用 OpenCvSharpExtern
OpenCvSharp 内部使用:calib3d_findCirclesGrid_InputArray
和 calib3d_findCirclesGrid_vector
.
它们的签名仅在使用 C++ 类型时有所不同 cv::_OutputArray
和 std::vector<cv::Point2f>
对于 centers
参数,但在 C# 外部定义中,它们都定义为 IntPtr
,使这些方法在 C# 的编译时可互换。
受影响的 git 版本(最新提交 e14c711958)具有两个 C# 重载 FindCirclesGrid
映射到相同的互操作调用 calib3d_findCirclesGrid_InputArray
,因此重载使用 Point2f[]
不起作用,因为 C++ 代码没有获得它期望的参数。
例如使用校准图像的模拟 here作为输入图像:
// Fails with NuGet package OpenCvSharp-AnyCPU 2.4.10.20150320.
using (var imageStream = new MemoryStream())
{
using (var circleBoard = new System.Drawing.Bitmap(650, 850))
using (var g = System.Drawing.Graphics.FromImage(circleBoard))
{
g.Clear(System.Drawing.Color.White);
for (int y = 0; y <= 10; y += 1)
for (int x = 0; x <= 3; x += 1)
{
var dx = 10 + x * 150;
var dy = 10 + y * 75;
g.FillEllipse(System.Drawing.Brushes.Black, dx + ((y + 1) % 2) * 75, dy, 50, 50);
}
circleBoard.Save(imageStream, System.Drawing.Imaging.ImageFormat.Png);
}
Mat im = Cv2.ImDecode(imageStream.GetBuffer(), OpenCvSharp.LoadMode.GrayScale);
Size patternsize = new Size(4, 11);
var centers = new List<Point2f>();
if (Cv2.FindCirclesGrid(im, patternsize, OutputArray<Point2f>.Create(centers), FindCirclesGridFlag.AsymmetricGrid | FindCirclesGridFlag.Clustering))
{
// Ok, finds 44 circles
Console.WriteLine(centers.Count());
}
Point2f[] centers2 = null;
if (Cv2.FindCirclesGrid(im, patternsize, out centers2, FindCirclesGridFlag.AsymmetricGrid | FindCirclesGridFlag.Clustering))
{
// Crashes with AccessViolationException
Console.WriteLine(centers2.Count());
}
}
关于c# - FindCirclesGrid 中的 OpenCVSharp AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30004528/
我在 Python 2.7 中使用 OpenCV 3 来校准不同的相机。我使用 findCirclesGrid() 函数,它成功地找到了 4 by 11 circle pattern在 1 兆像素的图
我正在使用 OpenCVSharp 运行一些校准测试,但我似乎无法让 FindCirclesGrid 工作,我在调用 FindCirclesGrid 时遇到了一个非常意外的 AccessViolati
我正在尝试使用圆网格执行相机校准。我一直没有成功,因为 findCirclesGrid 总是返回 false,即使文件只是一个圆网格也是如此。我把它归结为这个简单的程序: #include #inc
中的网格 未找到,尽管 simpleBlobDetector检测每个 blob。 我使用以下代码,图像作为输入图像: vector pointBuf; Size gridSize(4,
我是一名优秀的程序员,十分优秀!