【问题标题】:Issues with Cricket ball tracking板球跟踪问题
【发布时间】:2020-09-02 09:34:24
【问题描述】:

一周前我开始学习 Python 和深度学习,因为我想帮助我女儿分析她的板球比赛技巧。我使用网络上的以下代码作为起点,因为这是我可以参考的最接近的代码。这是代码的链接。https://www.analyticsvidhya.com/blog/2020/03/ball-tracking-cricket-computer-vision/

虽然我能够理解并执行代码直到最后一步,但是我被代码的以下部分卡住并且自过去 2 天以来我无法继续,这是在我完成所有可能的研究之后.

以下是代码的一部分,代码行x,y,w,h = cv2.boundingRect(countours[i]) 给出了错误。

!rm -r ball/*

ball_df = pd.DataFrame(columns=['frame','x','y','w','h'])
for idx in range(len(frames)):

    img= cv2.imread('FFrames/' + frames[idx])
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray,(25, 25),0)
    _ , mask = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
    image, contours = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


    num=20
    cnt=0
    df = pd.DataFrame(columns=['frame','x','y','w','h'])
    for i in range(len(contours)):
        x,y,w,h = cv2.boundingRect(contours[i]) 

        numer=min([w,h])
        denom=max([w,h])
        ratio=numer/denom

        if(x>=num and y>=num):
            xmin=x-num
            ymin=y-num
            xmax=x+w+num
            ymax=y+h+num
        else:
            xmin=x
            ymin=y
            xmax=x+w
            ymax=y+h

        if(ratio>=0.5):    
            #print(cnt,x,y,w,h,ratio)
            df.loc[cnt,'frame'] = frames[idx]
            df.loc[cnt,'x']=x
            df.loc[cnt,'y']=y
            df.loc[cnt,'w']=w
            df.loc[cnt,'h']=h

            cv2.imwrite("patch/"+str(cnt)+".png",img[ymin:ymax,xmin:xmax])
            cnt=cnt+1

错误:

cv2.error: OpenCV(4.2.0) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/shapeescr.cpp:784: 错误:(-215:断言失败)npoints >= 0 &&(深度== CV_32F || depth == CV_32S) 在函数“pointSetBoundingRect”中

【问题讨论】:

  • 首先,您在提及“Frames”时使用了“FFrames”作为文件夹名称。确保您使用的是正确的文件夹。你得到一个断言失败。这可能是因为您作为 boundingRect 函数的参数传递的 contours[i] 。看看这个 (stackoverflow.com/questions/54734538/…)。我想这会解决你的问题。
  • 感谢 Md Shaiful Islam 的快速回复。文件夹名称 FFrames 是正确的,代码的第一部分工作正常(基本上得到轮廓)。但是,当我通过 Contours[ i] 作为参数然后它给我一个错误。当我只使用一帧/图像来测试代码时,这段代码运行良好,但是当我按照上一步中的说明传递整个帧时,我得到了错误。我也已经看过你建议的链接,但无法得到线索,因此想问她这个问题..
  • 这似乎是一个显而易见的步骤,但每个文件都会产生错误,还是只是一小部分?您能否在尝试操作之前打印出i 和文件名并确定问题所在?

标签: python opencv


【解决方案1】:

尝试使用以下方法:

cnt = contours[i]
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

x, w = leftmost[0], rightmost[0]
y, h = topmost[1], bottommost[1]

【讨论】:

  • 我尝试了您的代码,甚至按照@ aghast 的建议打印了。下面是我得到的错误。num=20 vcnt=0 df = pd.DataFrame(columns=['frame',' x','y','w','h']) for i in range(len(contours)): cnt = contours[i] print i ,cnt leftmost = tuple(cnt[cnt[:,:,0 ].argmin()][0]) 最右边 = tuple(cnt[cnt[:,:,0].argmax()][0]) 最上面 = tuple(cnt[cnt[:,:,1].argmin( )][0]) 最底部 = 元组(cnt[cnt[:,:,1].argmax()][0]) x, w = 最左边[0], 最右边[0] 最左边 = 元组(cnt[cnt[ :,:,0].argmin()][0]) 数组索引过多
  • 0 [[ 1 -1 -1 -1] [ 2 0 -1 -1] [ 3 1 -1 -1] [ 4 2 -1 -1] [ 5 3 -1 -1 ] [ 6 4 -1 -1] [-1 5 -1 -1]]
  • @Muhammad,当我打印代码上部的轮廓 (cv2.findcontours) 时,令人惊讶的是,所有 30 个感兴趣的帧的所有轮廓值都是相同的。这是导致 boundingRect 函数出现问题的原因吗..
  • 您能否在单个帧上绘制提取的轮廓并检查它们是否正确:cnt = contours[i] cv2.drawContours(frame, [cnt], 0, (0,255,0), 3) cv2.imwrite("test.jpg", frame)
  • 非常感谢@Muhammad 。我能够确定问题所在,因为我尝试了您的建议。为了大家的利益,我会在这里提到它...在其中一个代码行:---轮廓,层次结构= cv2.findContours(掩码,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)..我正在使用这条线:----Image,contours = cv2.findContours(mask,cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)并且不包括“层次结构”..我认为这是导致整个问题的原因..我能够通过 boundingRect 函数..非常感谢您的帮助..你摇滚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多