草庐IT

c++ - 在 opencv 中为任何随机棋盘查找棋盘点(模式大小未知)

coder 2023-11-17 原文

好吧,OpenCv 带有它在 C++ 中的函数 findCheckerboardCorners(),就像

bool findChessboardCorners(InputArray image, Size patternSize, 
OutputArray corners, 
int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE )

使用此功能一段时间后,我了解到图案大小必须在很大程度上符合图像,否则算法将拒绝检测任何棋盘。我想知道是否有任何棋盘的随机图像,这个函数会失败,因为输入 patternSize 的精确值是不切实际的。有没有办法,这个函数的 patternSize 可以从提供的图像中获得。任何帮助,将不胜感激。谢谢。

最佳答案

简短的回答:你不能。

OpenCV 棋盘格检测代码假定图案是统一的(所有方 block 具有相同的大小),因此,为了唯一定位其在图像中的位置,必须满足以下两个条件:

  1. 图案完全可见。
  2. 该模式具有已知数量的行和列。

如果违反了 1 或 2,则无法知道哪个角是“左上”角。

对于更一般的情况,特别是如果您预计图案可能会被部分遮挡,则必须使用不同的算法和非均匀图案,这样角点就可以被唯一识别。

有多种方法可以做到这一点。我最喜欢的图案是 Matsunaga 和 Kanatani 的“二维条形码”,它使用具有独特交叉比的方形长度序列。见论文 here .为了匹配它,一旦您将角点排序到网格中,就可以使用简单的多数表决算法:

  • 预先计算所有模式的角的连续 4 元组在水平和垂直方向上的交比。
  • 对网格中检测到的角执行上述操作。
  • 对于每一个可能的水平移动
    • 每一行
      • 累积在阈值内一致的交叉比率的数量
  • 选择协议(protocol)数量最多的水平移动。
  • 对每个可能的垂直移动重复上述操作,沿列计算交叉比率。
  • 分别和 union 重复上述两个步骤,颠倒垂直和水平以及垂直方向的交叉比的顺序,以考虑反射和旋转。

可以通过多种方式将检测到的角点放置在网格中。有一个经常被重新发现的 algorithm使用拓扑邻近性。这个想法是首先将每个角与它的一个小窗口内的所有正方形相关联,从而构建一个角->正方形表,然后将其作为图遍历以构建每个角彼此偏移的全局表。

关于c++ - 在 opencv 中为任何随机棋盘查找棋盘点(模式大小未知),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37541683/

有关c++ - 在 opencv 中为任何随机棋盘查找棋盘点(模式大小未知)的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  5. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  6. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  7. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐