python - 查找不同符号/字母的边界框
问题描述
我正在学习 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()
解决方案
推荐阅读
- maven - JsonIgnore 注释不适用于 Lombok
- python - 错误!blahfile 不是 UTF-8 编码的。保存已禁用
- c++ - QML 没有加载模块插件,没有加载 dll 文件,说没有足够的空间来处理命令
- python - 如何使用透视变换在openCV中分割白色钢琴键
- h.264 - H.264 编码与 B 帧帧数
- c# - 具有抽象类实现的泛型函数
- mtu - Amazon Prime 视频带宽问题错误:Sony Android TV 上的 1060
- python - python3递归遍历目录并找到最大的文件大小
- .net - 将现有的 Angular 应用程序与现有的 .net mvc 和 .net 核心应用程序集成需要哪些步骤?
- java - Java Streams - 缓冲巨大的流