2017-09-18 25 views
5

मैं अजगर और ओपनसीवी का उपयोग कर एक हस्तलेख पहचान प्रणाली बनाने की कोशिश कर रहा हूं। पात्रों की मान्यता समस्या नहीं है लेकिन विभाजन है। मैं सफलतापूर्वक:ओपनसीवी - क्रॉपिंग हस्तलिखित रेखाएं (रेखा विभाजन)

  • एकल वर्ण में एक शब्द भी खंडित किया
  • आवश्यक आदेश में शब्दों में एक एक वाक्य खंडित किया।

लेकिन मैं दस्तावेज़ में अलग-अलग पंक्तियों को विभाजित नहीं कर सका। मैंने समोच्चों को क्रमबद्ध करने की कोशिश की (रेखा विभाजन से बचने और केवल शब्द विभाजन का उपयोग करने के लिए) लेकिन यह काम नहीं किया। (यह बाएँ से सही ढंग से हल कर शब्द रिटर्न) मैं एक हस्तलिखित दस्तावेज़ में निहित खंड शब्द के लिए निम्न कोड का इस्तेमाल किया है, लेकिन यह बाहर के आदेश शब्द रिटर्न:

import cv2 
import numpy as np 
#import image 
image = cv2.imread('input.jpg') 
#cv2.imshow('orig',image) 
#cv2.waitKey(0) 

#grayscale 
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 
cv2.imshow('gray',gray) 
cv2.waitKey(0) 

#binary 
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV) 
cv2.imshow('second',thresh) 
cv2.waitKey(0) 

#dilation 
kernel = np.ones((5,5), np.uint8) 
img_dilation = cv2.dilate(thresh, kernel, iterations=1) 
cv2.imshow('dilated',img_dilation) 
cv2.waitKey(0) 

#find contours 
im2,ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 

#sort contours 
sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0]) 

for i, ctr in enumerate(sorted_ctrs): 
    # Get bounding box 
    x, y, w, h = cv2.boundingRect(ctr) 

    # Getting ROI 
    roi = image[y:y+h, x:x+w] 

    # show ROI 
    cv2.imshow('segment no:'+str(i),roi) 
    cv2.rectangle(image,(x,y),(x + w, y + h),(90,0,255),2) 
    cv2.waitKey(0) 

cv2.imshow('marked areas',image) 
cv2.waitKey(0) 

कृपया ध्यान दें कि मैं खंड सभी शब्दों यहाँ करने में सक्षम हूँ, लेकिन वे वहाँ order.Is अलग एल में छवि नीचे

या

खंड के लिए शीर्ष के क्रम में इन आकृति सॉर्ट करने के लिए किसी भी तरह से बाहर दिखाई देते हैं इनस ताकि प्रत्येक पंक्ति को उपरोक्त कोड का उपयोग करके शब्दों में विभाजित किया जा सके?

+0

आप इसे एक्स और वाई द्वारा क्यों क्रमबद्ध नहीं करते? – Tom

+0

असल में मैंने कोशिश की लेकिन यह सिर्फ फिर से समोच्चों की पूरी तरह से पुनरावृत्ति में परिणाम देता है। यह सही क्रम में समोच्च वापस नहीं करता है। मैंने बाएं-टू-दाएं सॉर्टिंग के बाद टॉप-डाउन सॉर्टिंग किया, लेकिन समोच्च क्रम से बाहर हैं। तो मुझे लगता है कि प्रत्येक लाइन को अलग करने की आवश्यकता होगी। –

+0

एक्स, वाई के आधार पर एक सूची सॉर्टिंग कॉन्टूर बनाना, मैं सबसे आसान कहूंगा। एक छवि जोड़ें आप कर सकते हैं। –

उत्तर

5

मैं गया लाइन पर उपरोक्त कोड में एक परिवर्तन कर के लिए आवश्यक विभाजन:

kernel = np.ones((5,100), np.uint8) 

अब मैं आउटपुट के रूप में निम्नलिखित segmented lines of input text :

kernel = np.ones((5,5), np.uint8) 

मैं इसे करने के लिए बदल यह हस्तलिखित टेक्स्ट छवियों के साथ भी काम करता है जो पूरी तरह से क्षैतिज नहीं हैं:

संबंधित मुद्दे