У меня есть следующее изображение в качестве ввода:
There was a latex generated pdf document which is converted to image using following portion of code.
pages = convert_from_path('input.pdf', 500)
for page in pages:
page.save('temp.jpg','JPEG')
Now, I have a jpg image. My main goal is to segment following image based on marker(here they are cirle, square, triangle).
Final expected result something like this:
Question 1:
Question 1 Option A:
Question 1 Option B:
Question 1 Option C:
Question 1 OPtion D:
All others portion are also segmented in similar manner. For now, I want to recognise or detect regular shape like circle, square and triangle.
I have tried это учебник по сопоставлению шаблонов. Код:
import cv2
import numpy as np
img = cv2.imread("temp.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread("template.jpg", cv2.IMREAD_GRAYSCALE)
w, h = template.shape[::-1]
result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= 0.4)
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 3)
img = cv2.resize(img, (1000, 1000))
cv2.imshow('img',img)
# cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Это привело к следующему:
,
currently considering square only. I want only to detect shapes like square, circle and triangle separately.
I have also tried this . Это подход на основе контуров. Этот метод работает для данного image , на моем примере ввода не ожидается.
import numpy as np
import cv2
img = cv2.imread('temp.jpg')
gray = cv2.imread('temp.jpg',0)
ret,thresh = cv2.threshold(gray,127,255,1)
contours,h = cv2.findContours(thresh,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
for cnt in contours:
approx = cv2.approxPolyDP(cnt,0.01*cv2.arcLength(cnt,True),True)
print (len(approx))
if len(approx)==3:
print ("triangle")
cv2.drawContours(img,[cnt],0,(255,0,0),-1)
elif len(approx)==4:
print ("square")
cv2.drawContours(img,[cnt],0,(0,255,0),-1)
elif len(approx) > 15:
print ("circle")
cv2.drawContours(img,[cnt],0,(0,0,225),-1)
img = cv2.resize(img, (1500,780))
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Вывод:
В этом случае это должно работать, но я получаю неожиданный результат. Пожалуйста, помогите, и если требуется дополнительная информация, пожалуйста, дайте мне знать.
Python: 3.7.7
OpenCV: 4.1.1