import cv2
import numpy as np
import matplotlib.pyplot as plt
cnt = np.array([[[1,0]],
[[-1,0]],
[[-2,2]],
[[0,3]],
[[2,2]]])
contourArea = cv2.contourArea(cnt)
ax = plt.axes(aspect=1,xlim=[-3,3],ylim=[4,-1])
plt.title('อาณาเขต = %.2f ตารางพิกเซล'%contourArea,family='Tahoma')
ax.add_patch(plt.Polygon(cnt[:,0],fc='y',ec='k'))
plt.grid(ls=':',c='r')
plt.show()
cnt = np.array([[[0,0]],
[[0,3]],
[[4,0]]])
arcLength = cv2.arcLength(cnt,True)
ax = plt.axes(aspect=1,xlim=[-1,5],ylim=[-1,4])
plt.title('ความยาวเส้นล้อม = %.2f พิกเซล'%arcLength,family='Tahoma')
ax.add_patch(plt.Polygon(cnt[:,0],fc='c',ec='b'))
plt.grid(ls=':',c='g')
plt.show()
cnt = np.array([[[0,0]],
[[-100,300]],
[[300,100]]])
x,y,w,h = cv2.boundingRect(cnt)
ax = plt.axes(aspect=1,xlim=[-200,400],ylim=[400,-100])
ax.add_patch(plt.Polygon(cnt[:,0],fc='g',ec='m'))
ax.add_patch(plt.Rectangle((x,y),w,h,fc='w',ec='k',alpha=0.6))
plt.grid(ls=':',c='y')
plt.show()
cnt = np.array([[[0,0]],
[[-10,30]],
[[10,40]],
[[30,10]],
[[10,10]]])
(x,y),r = cv2.minEnclosingCircle(cnt)
ax = plt.axes(aspect=1,xlim=[-20,40],ylim=[50,-10])
ax.add_patch(plt.Polygon(cnt[:,0],fc='r',ec='k'))
ax.add_patch(plt.Circle((x,y),r,fc='g',ec='m',alpha=0.6))
plt.grid(ls=':',c='c')
plt.show()
import matplotlib as mpl
cnt = np.array([[[0,0]],
[[-20,50]],
[[20,70]],
[[60,60]],
[[40,20]]])
(x,y),(w,h),mum = cv2.fitEllipse(cnt)
ax = plt.axes(aspect=1,xlim=[-50,80],ylim=[100,-30])
ax.add_patch(plt.Polygon(cnt[:,0],fc='b',ec='r'))
ax.add_patch(mpl.patches.Ellipse((x,y),w,h,angle=mum,fc='c',ec='g',alpha=0.6))
plt.grid(ls=':',c='m')
plt.show()
x = np.arange(0,80,10,dtype=np.float32)
y = 16-((x-40)**2)/25
cnt = np.vstack([x,y]).T.reshape(-1,1,2)
# คำนวณค่าโมเมนต์
m = cv2.moments(cnt)
print(m)
# คำนวณจุดเซนทรอยด์
cx = m['m10']/m['m00']
cy = m['m01']/m['m00']
print('cx = ',cx)
print('cy = ',cy)
ax = plt.axes(aspect=1)
# วาดเส้นเค้าโครง
ax.add_patch(plt.Polygon(cnt[:,0],fc='y',ec='m',alpha=0.3))
# วาดจุดมุม
plt.scatter(x,y,c='r')
# วาดจุดเซนทรอยด์
plt.scatter(cx,cy,s=100,c='b',marker='x')
plt.grid(ls=':',c='c')
plt.show()
ได้
{'m00': 2240.0, 'm10': 78400.0, 'm01': -32853.33333333333, 'm20': 3285333.333333333, 'm11': -933333.3333333333, 'm02': 927573.3333333333, 'm30': 152880000.0, 'm21': -36023466.666666664, 'm12': 23716693.333333332, 'm03': -26576896.0, 'mu20': 541333.333333333, 'mu11': 216533.33333333326, 'mu02': 445724.4444444445, 'mu30': 2.9802322387695312e-08, 'mu21': -2995911.1111111147, 'mu12': -2396728.88888889, 'mu03': 102096.59259258956, 'nu20': 0.10788690476190468, 'nu11': 0.04315476190476188, 'nu02': 0.08883219954648526, 'nu30': 1.254960517316626e-16, 'nu21': -0.012615628100805144, 'nu12': -0.010092502480644108, 'nu03': 0.00042992351733354094}
cx = 35.0
cy = -14.666666666666664
ลำดับที่ | ชื่อ | ค่าที่ต้องใส่ | ชนิดข้อมูล |
---|---|---|---|
1 | contour | เส้นเค้าโครง | np.array |
2 | pt | ตำแหน่งจุด | tuple ของ float |
3 | measureDist | ถ้า True จะคะนวณระยะทางด้วย ถ้า False จะแค่บอกว่าอยู่นอกหรือใน |
True/False |
pika = cv2.imread('a15c07.png',0)
# หาเค้าโครง
contour,_ = cv2.findContours(pika,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cnt = contour[0]
plt.figure(figsize=[6,6])
plt.imshow(cv2.cvtColor(pika,cv2.COLOR_GRAY2RGB))
# สุ่มจุดขึ้นมา
xy = np.random.randint(100,500,[20,2])
for x,y in xy:
ptest = cv2.pointPolygonTest(cnt,(x,y),True)
if(ptest<0):
c = 'm' # อยู่นอก
else:
c = 'g' # อยู่ใน
plt.scatter(x,y,10,c=c)
plt.text(x,y,' %.1f'%ptest,color=c)
plt.show()
ลำดับที่ | ชื่อ | ค่าที่ต้องใส่ | ชนิดข้อมูล |
---|---|---|---|
1 | contour1 | เส้นเค้าโครง 1 | np.array |
2 | contour2 | เส้นเค้าโครง 2 | np.array |
3 | method | วิธีการคำนวณ | int |
4 | parameter | พารามิเตอร์ | float |
theta = np.radians(np.arange(0,360,15,np.float32))
r = [2+np.cos(theta*30),
2+np.sin(theta*30),
(2+np.cos(theta*30))*0.8,
1.5+np.cos(theta*30)]
contour = []
for i in range(4):
x = r[i]*np.cos(theta)
y = r[i]*np.sin(theta)
contour.append(np.vstack([x,y]).T.reshape(-1,1,2))
plt.figure(figsize=[6,6])
for i in range(4):
for j in range(i,4):
match = cv2.matchShapes(contour[i],contour[j],1,0)
ax = plt.subplot(4,4,1+5*i+(j-i),aspect=1,xlim=[-3,3],ylim=[-3,3],xticks=[],yticks=[])
plt.text(0,3,'%.4f'%match,ha='center')
ax.add_patch(plt.Polygon(contour[i][:,0],fc='m',ec='k'))
ax.add_patch(plt.Polygon(contour[j][:,0],fc='g',ec='k',alpha=0.5))
plt.tight_layout(0)
plt.show()
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ