首页 > 解决方案 > 查找不同符号/字母的边界框

问题描述

我正在学习 OpenCV 边界框,到目前为止它对我有好处。但是,我很难找到稍微复杂的字母/符号的边界。

我查看了文档,但找不到与如何找到复杂符号/字母(例如 %、! 或字母 j 或 i)的边界框有关的任何内容

我附上了我的输入图像。输入图像

我用来处理边界框的代码。

import cv2
import numpy as np

img=cv2.imread('test.jpg')
imgCont=img.copy()
imgFinal=img.copy()


imggray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgcanny=cv2.Canny(imggray,200,240)
contours,_ = cv2.findContours(imgcanny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

rect_d=[] #store the dimensions of my bounding boxes
min_cont_area=10
for cnt in contours:
    #print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt)>min_cont_area: #Limit the contours based on area?  
        box_d=cv2.boundingRect(cnt)
        x,y,w,h=box_d
        rect_d.append([x,y,w,h]) 
        cv2.rectangle(imgCont, (x,y),(x+w,y+h), (0, 0, 255),1)

i=0
roi_n=[] #store each bounding box for later
for d in range(0,len(rect_d)):    
    x=rect_d[i][0] #Find x 
    y=rect_d[i][1] #Find y 
    w=rect_d[i][2] #Find width 
    h=rect_d[i][3] #Find height 
    roi=imgFinal[y:y+h,x:x+w]
    roi_n.append(roi)
    cv2.imwrite('Boxed_ROIs_'+str(i) + '.jpg', roi) 
    i+=1

cv2.imshow('Final Result',imgCont)
cv2.imwrite('Final Result.jpg',imgCont)

cv2.waitKey(0)
cv2.destroyAllWindows()

我从我的代码中得到的输出。 我的输出

如果有人可以帮助我了解如何去做:

1)查找不规则边界多边形(不是框),例如“3的平方根”有一个“平方根”的不规则边界多边形和一个“3”的边界框

2)是否可以说水平/垂直/对角合并边界框。例如,如果我知道如何垂直合并“=”符号的边界框或对角合并“%”的边界框,这将有所帮助。

3)是否也可以将边界框分成几个边界框?

我想要的输出看起来像这样。 在此处输入图像描述

**********************更新*************************** *****************

我设法根据您的建议进行了更新,但是,我不确定如何获得平方根符号,!和 = 自己的边界框上的符号。

import cv2
import numpy as np

img=cv2.imread('test.jpg')
imgCont=img.copy()
imgFinal=img.copy()

imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,imgThresh = cv2.threshold(imgGray,249,250,cv2.THRESH_BINARY_INV)

kernel_erosion = np.ones((1,1),np.uint8)
imgErode = cv2.erode(imgThresh,kernel_erosion,iterations = 2)

kernel_open = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(1,2))
imgOpen = cv2.morphologyEx(imgErode, cv2.MORPH_OPEN, kernel_open)

kernel_dilate = np.ones((2,2),np.uint8)
imgDilate = cv2.dilate(imgOpen,kernel_dilate,iterations = 4)

contours,_ = cv2.findContours(imgDilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

rect_d=[] #store the dimensions of my bounding boxes
min_cont_area=5
for cnt in contours:
    #print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt)>min_cont_area: #Limit the contours based on area?  
        box_d=cv2.boundingRect(cnt)
        x,y,w,h=box_d
        rect_d.append([x,y,w,h]) 
        cv2.rectangle(imgCont, (x,y),(x+w,y+h), (0, 0, 255),1)

i=0
roi_n=[] #store each bounding box for later
for d in range(0,len(rect_d)):    
    x=rect_d[i][0] #Find x 
    y=rect_d[i][1] #Find y 
    w=rect_d[i][2] #Find width 
    h=rect_d[i][3] #Find height 
    roi=imgFinal[y:y+h,x:x+w]
    roi_n.append(roi)
    cv2.imwrite('Boxed_ROIs_'+str(i) + '.jpg', roi) 
    i+=1

#cv2.imshow('Final Result',imgCont)
#cv2.imwrite('Final Result.jpg',imgCont)

cv2.waitKey(0)
cv2.destroyAllWindows()

我更新的输出: 更新输出

标签: pythonpython-3.xopencvimage-processingbounding-box

解决方案


推荐阅读