得到运动比赛的次数

2024-04-23 14:51:51 发布

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

我有很多高分辨率的照片。我要从照片上得到马拉松运动员的号码。 示例图像:https://drive.google.com/open?id=1rfOnnKDUmbR3A8xAhpwHdykhNFfMR1QG

为了解决这个问题,我要做以下步骤。你知道吗

  1. 检测图像中的人物
  2. 在人员区域中检测号码区域
  3. 使用tesseract或tensorflow ocr获取数字

我检测到一个人成功地使用了yolo3。但在我看来,使用findContours获取数字区域非常困难。点数不是4。所以我用面积过滤矩形,得到一些矩形。我不确定这是正确的方法。 但我在下一步遇到了问题。 我试着从这些地区得到号码,但找不到正确的号码。我试图做预处理,但结果没有改善。你知道吗

        imgOriginalScene = cv2.bilateralFilter(imgOriginalScene, 11, 17, 17)
        cv2.imshow("Bilateral", imgOriginalScene)

        kernel = np.ones((1,1),np.uint8)
        imgOriginalScene = cv2.erode(imgOriginalScene,kernel,iterations = 2)
        cv2.imshow("Erode", imgOriginalScene)

        kernel = np.ones((2,2),np.uint8)
        imgOriginalScene = cv2.dilate(imgOriginalScene,kernel,iterations = 2)
        cv2.imshow("Dilate", imgOriginalScene)

        imgOriginalScene = cv2.Canny(imgOriginalScene, 30, 200)
        cv2.imshow("Canny", imgOriginalScene)

        imgCanny = imgOriginalScene

        contours = cv2.findContours(imgOriginalScene.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        contours = imutils.grab_contours(contours)

        imgContours = np.zeros((height, width, 3), np.uint8)

        rects = [cv2.boundingRect(cnt) for cnt in contours]
        rects = sorted(rects,key=lambda  x:x[1],reverse=True)

        imgRect = imgCrop
        imgRectDisp = imgCrop

        imgRect = cv2.cvtColor(imgRect, cv2.COLOR_BGR2GRAY)
        ret_thresh, thresh = cv2.threshold(imgRect, kmeans(input_img=imgRect, k=8, i_val=5)[0], 255, cv2.THRESH_BINARY)
        cv2.imshow("or", thresh)

        i = -1
        j = 1
        y_old = 5000
        x_old = 5000
        for rect in rects:
            x,y,w,h = rect
            area = w * h

            if w > h and w < h * 4 :
                i += 1
                y_old = y

                x,y,w,h = rect

                cv2.rectangle(imgContours, (x , y ), (x + w , y + h ), color, 1)
                cv2.rectangle(imgRectDisp, (x , y ), (x + w , y + h ), color, 3)

                bbcrop = thresh[y : y + h, x : x + w]
                config = ('-l eng --oem 1 --psm 3')
                text = pytesseract.image_to_string(bbcrop, config=config)
                print("OCR " + text)

                j += 1

        cv2.imshow("contours", imgContours)
        cv2.imshow("rectangle", imgRectDisp)

在我的代码中,tesseract无法检测到号码。我想知道我的预处理是否不合适。你知道吗

我也想知道如何提高tesseract的精确度。我应该为OCR培训自己的模型吗?有人能帮我吗? 谢谢您!你知道吗


Tags: 区域npcv2kernel号码imshowtesseractrects