Я изучаю ограничивающие рамки 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()
Вывод, полученный из моего кода.
Если кто-нибудь может помочь мне понять, как go о:
1) Найти неправильные ограничивающие полигоны (не прямоугольники), например, с помощью "квадрата" 1041 * из 3 "имеют неправильный ограничивающий многоугольник для" квадрата root "и ограничивающий прямоугольник для" 3 "
2) Можно ли объединить ограничивающие прямоугольники по горизонтали / вертикали / по диагонали. Например, было бы полезно, если бы я знал, как объединить ограничивающие прямоугольники для знака "=" или объединить ограничивающие прямоугольники для "%".
3) Можно ли разделить ограничивающие прямоугольники на несколько ограничивающих ящики?
Мой желаемый результат будет выглядеть примерно так.
********************** ОБНОВЛЕНИЕ ************ ********************************
Мне удалось обновить на основе ваших предложений, однако я не знаю, как получить квадратный root символ,! и = символ на его собственных ограничивающих прямоугольниках.
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()
Мой обновленный вывод: