OpenCV中没有直接提供计数的功能,但是可以通过图像处理技术来实现计数。以下是一些使用OpenCV进行计数的示例:
使用Canny边缘检测算法进行计数:对于一些特定的物体,例如筷子,可以通过对图像进行边缘检测,然后根据边缘的位置和形状来判断计数的数量。这种方法需要对筷子的形状和位置有一定的了解。
使用模板匹配进行计数:对于一些特定的物体,例如硬币,可以通过将图像与标准模板进行匹配,然后根据匹配的结果来判断计数的数量。这种方法需要对物体的形状和大小有一定的了解。
使用机器学习算法进行计数:对于一些复杂的场景,例如车流量计数,可以通过使用机器学习算法对图像进行分类和计数。这种方法需要大量的训练数据和计算资源。
需要注意的是,不同的计数方法适用于不同的场景和物体,需要根据具体情况选择合适的方法。
手机上有相关软件,查筷子查竹签,感觉非常有意思,所以也使用opencv玩一下。
二、程序开发
2.1 基本功能实现步骤
使用OpenCV进行计数的流程如下
1.加载图像。
2.将图像转为灰度图。
3.对灰度图进行二值化处理。
4.统计二值化处理后的图像中的目标物体数目。
2.2 代码实
# -*- coding: utf-8 -*-
#===================导入库==================
import cv2
#===================读取原始图像==================
img=cv2.imread('img.png',1)
#====================图像预处理===========================
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #色彩空间转换:彩色-->灰度图片
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV) # 阈值处理二值反色
kernel=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(1,1))#核
erosion=cv2.erode(binary,kernel,iterations=1) #腐蚀操作
dilation=cv2.dilate(erosion,kernel,iterations=1) #膨胀操作
gaussian = cv2.GaussianBlur(dilation,(1,3),0)# 高斯滤波
#================查找所有轮廓=======================
contours,hirearchy=cv2.findContours(gaussian, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 找出轮廓
#==============筛选出符合要求的轮廓=============
contoursOK=[] #放置符合要求的轮廓
for i in contours:
if cv2.contourArea(i)>30: # 筛选出面积大于30的轮廓
contoursOK.append(i)
#==============绘制出符合要求的轮廓=============
draw=cv2.drawContours(img,contoursOK,-1,(0,255,0),1) #绘制轮廓
#===========计算每一个细胞中心,并绘制数字序号===============
for i,j in zip(contoursOK,range(len(contoursOK))):
M = cv2.moments(i)
cX=int(M["m10"]/M["m00"])
cY=int(M["m01"]/M["m00"])
cv2.putText(draw, str(j), (cX, cY), cv2.FONT_HERSHEY_PLAIN,1.5, (0, 0, 255), 2) #在中心坐标点上描绘数字
#=============显示图片==================
cv2.imshow("gaussian",gaussian)
cv2.imshow("draw",draw)
#============释放窗口====================
cv2.waitKey()
cv2.destroyAllWindows()
三、运行脚本