OpenCV蛋数Python

2024-09-30 22:23:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我用openCV和python做了一个鸡蛋计数,并从这里得到了帮助egg detection

while True:

 (grabbed, frame) = cap.read()  
 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
 th, bw = cv2.threshold(hsv[:, :, 2], 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
 morph = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel)
 dist = cv2.distanceTransform(morph, cv2.DIST_L2, cv2.DIST_MASK_PRECISE)
 .....

我得到了坐标,在鸡蛋上画了一个椭圆。在

^{pr2}$

我划了一条线,一个一个地数鸡蛋。在

cv2.line(frame40, (0,coordYEntranceLine), (width,coordYEntranceLine), (255, 0, 0), 2)

def CheckEntranceLineCrossing(coordYContour, coordYEntranceLine):
   absDistance = abs(coordYContour - coordYEntranceLine)

   if ((coordYContour >= coordYEntranceLine) and (absDistance <= 3)):
     return 1
   else:
     return 0

if CheckEntranceLineCrossing(coordYContour, coordYEntranceLine, area):
   eggCount += 1

问题从这里开始。根据逻辑,如果鸡蛋超过生产线,距离<;3正在计数,但是传送带停止,距离<;3正在重新计数鸡蛋,并且会认为鸡蛋太多鸡蛋。那个我想要的是不要再检测到被检测到的卵子。在

整个代码大致是这样的:

def CheckEntranceLineCrossing(coordYContour, coordYEntranceLine):
   absDistance = abs(coordYContour - coordYEntranceLine)

   if ((coordYContour >= coordYEntranceLine) and (absDistance <= 3)):
      return 1
   else:
      return 0

def getDistance(coordYEgg1,coordYEgg2):
   dist = abs(coordYEgg1 - coordYEgg2)

   return dist

cap = cv2.VideoCapture('20180910_144521.mp4')

while True:

(grabbed, frame) = cap.read()

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
th, bw = cv2.threshold(hsv[:, :, 2], 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
......

flag = False
egg_list = [[]]
egg_index = 0

for i in range(len(contours)):
    (x, y, w, h) = cv2.boundingRect(contours[i])
    #_, mx, _, mxloc = cv2.minMaxLoc(dist[y:y+h, x:x+w], peaks8u[y:y+h, x:x+w])

    egg_list.append([x, y, flag])

    for i in range(len(egg_list)):
        egg_index = i

        egg_new_X = x
        egg_new_Y = y

        if len(egg_list[egg_index]) >= 1:
            dist = getDistance(egg_new_Y, egg_list[egg_index][1])

            if dist > 50:
                egg_list.append([egg_new_X, egg_new_Y, flag])




    if CheckEntranceLineCrossing(egg_list[i][1], coordYEntranceLine) and not egg_list[i][2]:
        eggCount += 1
        egg_list[i][2] = True

在这方面你有什么方法可以建议吗?我是否有机会将检测到的轮廓放入数组并控制它或其他什么?在


Tags: newreturnifeggdistcv2hsvframe
1条回答
网友
1楼 · 发布于 2024-09-30 22:23:49

你需要在每一帧中跟踪鸡蛋。
1) 假设第1帧中有5个鸡蛋。将鸡蛋的位置和标志存储在一个数组中,即egg_list。

flag = False
egg_list = [[]]
for contour in contours:
   ellipse = cv2.fitEllipse(contour)
   (x, y, w, h) = cv2.boundingRect(contour)
   egg_list.append([x, y , flag])

2)然后找出第二帧中的所有鸡蛋,并与鸡蛋清单进行比较。如果距离低于某个预定义值,则将它们视为同一个鸡蛋。否则,将新鸡蛋添加到鸡蛋列表中。

^{pr2}$

3)当一个鸡蛋过线时,在鸡蛋列表中用一个标志标记该鸡蛋,并增加计数。然后当同一个鸡蛋被检测到越界时,你可以忽略它。在

egg_index = 0
for contour in contours:
   if CheckEntranceLineCrossing(egg_list[egg_index,2], coordYEntranceLine) & ~egg_list[egg_index,2]:
      eggCount += 1
      egg_list[egg_list,2] = true;

把你所有的鸡蛋都记在一张单子上,你就可以只数那些重要的鸡蛋了。在

相关问题 更多 >