让我们说我有以下图片,我想用Numpy在Python中用OpenCV进行分析:
我将所有白色块标记为轮廓。我还在红色和绿色圆点周围标记轮廓。
如何检查哪个点位于哪个白色块中?
以下是我的尝试:
import numpy as np
import cv2
img = cv2.imread('crapypimg.bmp')
gray = cv2.imread('crapypimg.bmp',0)
ret, thresh = cv2.threshold(gray,127,255,1)
contours,h = cv2.findContours(thresh,1,2)
for cnt in contours:
approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
print len(approx)
if 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),3)
elif len(approx) > 15:
print "circle"
cv2.drawContours(img,[cnt],0,(0,255,255),3)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
答案 0 :(得分:1)
import cv2
img = cv2.imread('OFLCp.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)[1] # ensure binary
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
层次结构是您问题的答案。如果您要检查层次结构,它将看起来像这样:
array([[[-1, -1, 1, -1],
[ 3, -1, 2, 0],
[-1, -1, -1, 1],
[ 4, 1, -1, 0],
[ 6, 3, 5, 0],
[-1, -1, -1, 4],
[ 7, 4, -1, 0],
[ 9, 6, 8, 0],
[-1, -1, -1, 7],
[10, 7, -1, 0],
[12, 9, 11, 0],
[-1, -1, -1, 10],
[-1, 10, -1, 0]]], dtype=int32)
其中每一行都包含该索引处轮廓的层次结构信息。
行= [next_contour_index,previous_contour_index,first_child_contour_index,parent_contour_index]
因此,这里的0是最外面的正方形的索引。 索引2(圆形)处的轮廓的父级为1(正方形)。绘制一对孩子(红色),父母(黄色)。
答案 1 :(得分:0)