【python-opencv】硬币检测

使用 python3.8.x,opencv

硬币检测

  • 问题描述
  • 设计思路1
    • 使用简单特征识别
      • 具体操作
      • 部分代码
  • 设计思路2
    • 模板匹配
    • 源码

问题描述

  1. 使用图像处理技术,从照片中识别硬币的个数,并判断总价值。
    【python-opencv】硬币检测_第1张图片

设计思路1

使用简单特征识别

  1. 使用颜色特征,识别出5角硬币
  2. 使用半径大小,判断出1角和1元硬币。

具体操作

  1. 将图片转换为HSV颜色模型
    【python-opencv】硬币检测_第2张图片
hsv = cv2.cvtColor(imgROI, cv2.COLOR_BGR2HSV)
lowerYellowHSV = np.array([11,43,46])
upperYellowHSV = np.array([34,255,255])
mask=cv2.inRange(hsv,lowerb=lowerYellowHSV,upperb=upperYellowHSV)/255

【python-opencv】硬币检测_第3张图片

部分代码

def coinSimpleDetection(img,circlesVector):
    # 简单识别,利用硬币的色彩和半径进行区分

    circlesNum = circlesVector.shape[0]
    # 将图片裁剪出来
    candidateImage = {}
    for i in range(circlesNum):
        information = {"radius":0,"value":0}
        col,row,radius = circlesVector[i,:]
        imgTemp = img.copy()
        imgROI = imgTemp[row-radius:row+radius,col-radius:col+radius,:]
        information["radius"] = radius

        # 识别5角硬币
        hsv = cv2.cvtColor(imgROI, cv2.COLOR_BGR2HSV)
        lowerYellowHSV = np.array([11,43,46])
        upperYellowHSV = np.array([34,255,255])
        mask=cv2.inRange(hsv,lowerb=lowerYellowHSV,upperb=upperYellowHSV)/255
        if np.sum(np.array(mask))/((row+2*radius)*(col+2*radius)) > 0.05:
            information["value"] = 0.5

        # 根据半径判断1块,新旧1角硬币
        if information["value"] == 0:
            if information["radius"] > 180 and information["radius"] < 250:
                information["value"] = 0.1
            if information["radius"] > 250 and information["radius"] < 300:
                information["value"] = 1.0
        candidateImage.update({i:information})
    cionsValue = np.sum([candidateImage[k]["value"] for k in range(circlesNum)])
    return candidateImage,cionsValue

设计思路2

模板匹配

  1. 提取轮廓信息 cv2.findContours()
  2. 拟合椭圆,提取ROI cv2.fitEllipse()
  3. 模板匹配cv2.matchTemplate()
  4. 选取最优匹配
    【python-opencv】硬币检测_第4张图片

源码

链接
https://download.csdn.net/download/weixin_44545174/87391095

你可能感兴趣的:(图像处理,opencv,计算机视觉,python)