如何计算视频中的钢棒数量

时间:2017-12-04 11:00:50

标签: python opencv

我需要计算一下使用opencv的Python中的钢棒数量,如下图所示。

Image with the steel rods at the center 我最初将图像转换为灰度,然后使用侵蚀功能,然后使用canny edge函数检测边缘,如下所示。 image after canny edge 稍后找到轮廓并使用边界旋转矩形来计算杆。我无法得到正确的计数。

kernel = np.ones((4,4),np.uint8)
erosion = cv2.erode(gray,kernel,iterations = 1)
cv2.imshow('Erode',erosion)
canny=cv2.Canny(erosion,100,200)
cv2.imshow('Canny',canny)
kernele=np.array([[0,1,1,0],[0,1,1,0],[0,1,1,0],[0,1,1,0]],np.uint8)
dilation = cv2.dilate(canny,kernele,iterations = 1)
cv2.imshow('dilate',dilation)
c,cnt,h=cv2.findContours(dilation,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
if cnt:
    i=0
    for cnt in contours:
        rect = cv2.minAreaRect(cnt)
        box = cv2.boxPoints(rect)
        box = np.int0(box)
        if rect[1][0]>1 and rect[1][0]<15:  #width of rod
           i+=1

请建议修改内容或如何计算。 谢谢

Next Image

1 个答案:

答案 0 :(得分:1)

您可以尝试这种替代方式,而不是找到边缘然后按宽度移动。

我假设您的图像设置是恒定的,因此您可以裁剪包含杆的区域(否则会非常困难)。

enter image description here

自适应阈值图像具有适当的大小和常数。

enter image description here

然后在图像中选择100个随机行,并计算其中的黑色或白色条带的数量。

enter image description here

找出这100行的中位数并减去适当的条件以消除错误的边界计数(第一根杆之前和最后一根杆之后的白条)

代码:

import cv2
import numpy as np
from random import randint
from itertools import groupby

img = cv2.imread('img.jpg',0)
rod_count = []
rows, cols =img.shape[:2]
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
                    cv2.THRESH_BINARY,11, 2)

count = 100
while( count!=0 ):

    count = count-1
    random_row = randint(0, rows-1)

    arr = th2[random_row:random_row+1, :]
    arr2 = np.array(arr)[0].tolist()
    temp = [a[0] for a in groupby(arr2)]
    b = sum(x == 0 for x in temp)
    rod_count.append(b)


print np.median(rod_count)-2

输出 15