openCV: Невозможно обнаружить слишком маленькие сгенерированные латексом правильные формы, такие как квадрат, круг, треугольник? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть следующее изображение в качестве ввода:
image

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: image Question 1 Option A: image Question 1 Option B: image Question 1 Option C: image Question 1 OPtion D: image

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()

Это привело к следующему:
image
, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...