python opencv cv2.findContours无法匹配图像中的square

时间:2017-05-15 12:29:26

标签: python image opencv

我的图像如下:

enter image description here

广场内的手写是随机改变的,因此,有时看起来像:

enter image description here

我想通过以下代码匹配广场:

#!/usr/bin/env python
#coding: utf-8

import numpy as np
import cv2
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to input image")
args = vars(ap.parse_args())

img = cv2.imread(args["image"])
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

tmpimage,contours,h = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    approx = cv2.approxPolyDP(cnt,0.05*cv2.arcLength(cnt,True),True)
    print len(approx)
    if len(approx)==5:
        print "pentagon"
        #cv2.drawContours(img,[cnt],0,255,2)
    elif len(approx)==3:
        print "triangle"
        #cv2.drawContours(img,[cnt],0,(0,255,0),2)
    elif len(approx)==4:
        print "square"
        cv2.drawContours(img,[cnt],0,(0,0,255),2)
    elif len(approx) == 9:
        print "half-circle"
        #cv2.drawContours(img,[cnt],0,(255,255,0),2)
    elif len(approx) > 15:
        print "circle"
        #cv2.drawContours(img,[cnt],0,(0,255,255),2)

cv2.imshow('img',img)
cv2.imwrite('tmp.png',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我得到以下内容:

enter image description here

所以,没能得到广场。

我也改变了findContours和aboutPolyDP参数,但都未能获得中心广场。

我还尝试了模板匹配,代码段:

cv2.matchTemplate(an_origin_part,an_template,cv2.TM_CCOEFF_NORMED)

an_template image here:

enter image description here

我将阈值设置为0.55以匹配模板。

嗯,问题是,在目标squere中有随机手写,因此,模板匹配有时不再起作用。

ENV:

Python:2.7.10

Opencv:3.2.0

任何关于匹配广场的建议都表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:2)

最后,我解决了这个问题。

我找到的原因是在第一个阈值时删除了正方形。

所以,主要改变了以下两行:

ret,thresh = cv2.threshold(gray,200,255,cv2.THRESH_BINARY_INV)

请注意阈值和白黑反转。

tmpimage,contours,h = cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

请注意,我获取外部轮廓。

上面,我得到了广场: - )