我需要计算一下使用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
请建议修改内容或如何计算。 谢谢
答案 0 :(得分: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