目前已发布到 jigsight - GitHub
折腾家里的软装,想着整点「文化气息」。之前试过 DIY 数字油画,选了莫奈的《日出》,结果又一个夏天过去了,太阳不知道「出」到哪个角落里去了。于是这次决定换个方式,搞拼图。
选了张看起来挺有格调的《色达雪景》,尺寸 35 x 50 cm,500 片不分区,说是给成年人玩的,但我现在怀疑是给神仙玩的。
放一个卖家秀在这里:
到货拆开,就觉得肝开始隐隐作痛了。一条对角线分出了右下角的「纯白地狱」,而左上,反正我已经眼花了。
这时候我已经把纯白的部分先筛出来了:
难道整个假期都要耗在这上面了吗?我还有 Xenoblade Chronicles X 没有玩呢。
作为一个靠键盘吃饭的人,这时候就得打开 GitHub 了。
以关键词「jigsaw puzzle」搜索,倒是有一些项目,例如 Kawaboongawa / Zolver。不过他们的介绍视频里写着支持「up to 50 pieces」,emmm…
Zolver 是靠边缘匹配实现拼图求解的,讲道理,如果我让它去匹配这 500 片,再按顺序把每一片都找出来,那 …… 这和我直接手拼有什么难度上的区别?
我一向是从边角入手的派别,因为这样容易定位。那么,有没有一种方法,可以对任意一片拼图,求其在原图中的位置?
有的兄弟,有的,像特征检测这类的算法,在机器视觉中有很多
SIFT(Scale-Invariant Feature Transform)算法是一种提取图像特征点的算法,从名字上就提及了该算法不受旋转和缩放影响,此外该算法对光线、噪声、些微视角改变的容忍度也相当不错。
花一下午时间实现了一个 Demo,读取摄像头拍摄到的拼图画面,使用边缘提取为拼图碎片做个掩膜,用特征检测算法在拼图原图中寻找相似的特征点。
下面这张 WebP 应该是个动图,或者可以在这里 看视频,左边紫色的小点就是匹配到的特征点,点越密集,越说明手上的这块拼图应该搁那儿。
如果硬要给这个飞来飞去的识别框找个甩锅的地方,我选择扣给罗技 C922 HD Webcam 神秘的自动对焦功能,改天接上相机用手动微距镜头试试。
至于「纯白地狱」的部分,就算是 SIFT 也无能为力了,还是顺着 Zolver 的思路改进吧(不过别忘了在原图和计算完成图上叠加标号)。
反正这幅完成之后,我应该不会再玩 500 片以上的拼图了。
后续更新
经过 20 分钟的奋战:
我购买了 Felix Vallotton 的《La falaise et la grève blanche (1913)》。