我的图像如下:
广场内的手写是随机改变的,因此,有时看起来像:
我想通过以下代码匹配广场:
#!/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()
我得到以下内容:
所以,没能得到广场。
我也改变了findContours和aboutPolyDP参数,但都未能获得中心广场。
我还尝试了模板匹配,代码段:
cv2.matchTemplate(an_origin_part,an_template,cv2.TM_CCOEFF_NORMED)
an_template image here:
我将阈值设置为0.55以匹配模板。
嗯,问题是,在目标squere中有随机手写,因此,模板匹配有时不再起作用。
ENV:
Python:2.7.10
Opencv:3.2.0
任何关于匹配广场的建议都表示赞赏。
感谢。
答案 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)
请注意,我获取外部轮廓。
上面,我得到了广场: - )