【问题标题】:How to count the number of steel rods in a video如何计算视频中的钢棒数量
【发布时间】:2017-12-14 18:47:17
【问题描述】:

我需要计算钢棒的数量,在Python中使用opencv为下图。

Image with the steel rods at the center 我最初将图像转换为灰度,然后使用 erode 函数和 canny 边缘函数来检测边缘,如下所示。 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

【问题讨论】:

标签: python opencv


【解决方案1】:

您可以尝试这种替代方法,而不是查找边缘然后按宽度。

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

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

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

求这 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

【讨论】:

  • 感谢@I.Newton 的建议正在处理一个视频文件,上面提到的图像只是正在运行的视频的打印屏幕,我已经裁剪了只包含杆的图像,我尝试了上面的代码,它适用于图像,但是当与视频一起使用并应用于特定帧时,它会引发以下错误 --> th2 = cv2.adaptiveThreshold(cropped,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11, 2) cv2.error: D:\Build\OpenCV\opencv-3.3.1\modules\imgproc\src\thresh.cpp:1520: 错误: (-215) src.type() == (((0) & (( 1
  • 函数自适应阈值适用于灰度图像。在传递给函数之前,您需要使用img = cv2.cvtColor( img, cv2.COLOR_RGB2GRAY ) 将图像转换为灰度。
  • 谢谢,它的工作,我得到了正确的计数。用形态学,精明的技术不能数棒吗?关于改进上述代码的任何建议
  • 用精巧的边缘、霍夫线等处理然后消除噪音和所有的东西有点困难。最简单的是使用上面的数组。如果有帮助,请考虑支持或接受此答案。
  • 我尝试使用不同图像的上述逻辑,我已将新图像包含在底部的问题中作为下一个图像,它给出了错误的计数。是因为杆放置得很近还是照明问题,还是我应该改进图像,请提出要做什么@I.Newton
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多