如何使用OpenCV matchShapes检查两个轮廓是否匹配?

时间:2017-01-18 11:22:27

标签: java scala opencv

我正在尝试检查两个图像中检测到的轮廓是否匹配。我已经看到OpenCV有一个名为matchShapes的函数,它返回一个相似度量。但是,它只收到Mat Points,而不是所有matchShapes。在doc example中,它将第一个Mat Of Points传递给方法。

所以,我可以运行这个方法,每次传递一个Mat Of Points并获得一个度量,但是如果我想要一个唯一的相似性度量,我该怎么办呢?

也许迭代所有Mat Of Points,请var Binarized1:Mat=new Mat() var Binarized2:Mat=new Mat() var contours1 = new util.ArrayList[MatOfPoint]() var contours2 = new util.ArrayList[MatOfPoint]() //computing thresholds org.opencv.imgproc.Imgproc.threshold(mole1,Binarized1,0,255,org.opencv.imgproc.Imgproc.THRESH_BINARY_INV+org.opencv.imgproc.Imgproc.THRESH_OTSU) org.opencv.imgproc.Imgproc.threshold(mole2,Binarized2,0,255,org.opencv.imgproc.Imgproc.THRESH_BINARY_INV+org.opencv.imgproc.Imgproc.THRESH_OTSU) //finding contours org.opencv.imgproc.Imgproc.findContours(Binarized1,contours1,new Mat(),org.opencv.imgproc.Imgproc.RETR_EXTERNAL,org.opencv.imgproc.Imgproc.CHAIN_APPROX_NONE) org.opencv.imgproc.Imgproc.findContours(Binarized2,contours2,new Mat(),org.opencv.imgproc.Imgproc.RETR_EXTERNAL,org.opencv.imgproc.Imgproc.CHAIN_APPROX_NONE) //matching shapes var cnt1=contours1.get(0) var cnt2=contours2.get(0) print("matching shapes="+ org.opencv.imgproc.Imgproc.matchShapes(cnt1,cnt2,org.opencv.imgproc.Imgproc.CV_CONTOURS_MATCH_I1,0)) 并稍后计算一个均值?

代码:

{{1}}

我知道发布了类似的问题,但没有人能帮到我。

1 个答案:

答案 0 :(得分:1)

如果两个图像中都有多个轮廓,则在评估整体相似度之前,需要先匹配它们。

想象一下,两张照片中都有一个正方形和一张光盘。每个都有两个轮廓,但首先需要将圆盘轮廓与圆盘轮廓和方形轮廓与方形轮廓相匹配。你可以通过n * m轮廓比较,并存储每个轮廓的对应关系来做到这一点。

之后,您可以定义图像的相似性度量,这是匹配每个匹配轮廓的得分的平均值。