通过 Python 和 OpenCV 实现目标数量监控
2020-06-25 08:11:20 来源:易采站长站 作者:易采站长站整理
代码如下:
'''3ji是背景图不可换,调试换另一个图片,3ji自己用画图找到水的位置清除掉水柱即可,所以说摄像头不能动'''
firstframe=cv2.imread("3ji.jpg")
firstframe= cv2.cvtColor(firstframe, cv2.COLOR_BGR2GRAY)
firstframe= cv2.GaussianBlur(firstframe, (21, 21), 0)
secondframe0=cv2.imread("2.jpg")
secondframe0= cv2.cvtColor(secondframe0, cv2.COLOR_BGR2GRAY)
secondframe= cv2.GaussianBlur(secondframe0, (21, 21), 0)
frameDelta = cv2.absdiff(firstframe, secondframe)
x,y=frameDelta.shape
print(x,y)接着通过边缘检测找到水柱边界,方便查看。
#frameDelta和canny一个是区域一个是轮廓
img = cv2.GaussianBlur(frameDelta,(3,3),0)
canny = cv2.Canny(img, 0, 100)定义水柱总面积变量。清水面积变量,ss数组存储像素值位置
area=0 #6687,总面积
qingarea=0
ss=[]然后画出轮廓,并记录水柱处像素值得位置
#画轮廓,存储要识别的像素值位置,记录在ss数组中
for i in range(x):
for j in range(y):
if any(frameDelta[i,j]!=[0,0,0]):#白色的时候,占位
ss.append([i,j])然后以原图加轮廓图显示,图片相加即可:
canny0=cv2.add(secondframe0,canny)接着根据像素值大小判断颜色,通过调试这个项目的阈值是50
#判断水柱颜色,清水占多少像素
for t in ss:
k,l=t
area=area+1
if canny0[k, l] > 50:
print(canny0[k,l])
qingarea+=1
接着统计黑色水柱占比率为多少
deta=(qingarea/area)*100
print(qingarea)
pred="清水占比为"+str(deta)+"%"
print(pred)最后输出图像结果:
cv2.imwrite("pred.jpg",canny0)
canny0=cv2.imread("pred.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(canny0, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text((200, 10), pred, font=myfont, fill=(255,23,140))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow("frame", img_OpenCV)
key = cv2.waitKey(0)最终达到的演示效果如图所示:
清水占比96%,还是比较准确的
清水占比38%,黑水占比62%,也基本准确。
暂时禁止评论













闽公网安备 35020302000061号