Merge pull request 'update to read_qrcodes.py' (#1) from tom_taylor-patch-1 into main

Reviewed-on: #1
This commit is contained in:
tom_taylor 2024-09-21 23:09:28 +00:00
commit 57dbdb1722

View File

@ -1,5 +1,7 @@
from os import chdir, listdir
import numpy as np
from time import gmtime
def regulater(binary_array) :
if not (len(binary_array.shape) == 2 and set([itm for row in binary_array for itm in row]) <= set([0,255]) ):
print('binary_array is not two dimensional or not binary', len(binary_array.shape), set([itm for row in binary_array for itm in row]))
@ -31,16 +33,25 @@ def read_qrcodes(pdfdoc, inventory, pagenum=0) :
csvreader = csv.reader(invent, delimiter = '\t')
for line in csvreader :
try :
student_inventory[ line[ 4 ] ] = line[ 5 ]
serial_number = line[4]
filename = line[5]
#student_inventory[ line[0] ] = line[ 1 ]
except IndexError :
print('index error', line)
if len(line) == 0 :
continue
else :
print('index error csv', line)
raise IndexError
else :
student_inventory[ line[ 4 ] ] = line[ 5 ]
print('inventory', student_inventory)
doc = fitz.open(pdfdoc)
print('doc_length',doc.page_count)
mat = fitz.Matrix(8.0,8.0)
clip = fitz.Rect( (480,5), (600,110) )
clip = fitz.Rect( (480,5), (630,120) )
#(650,120)
qcd = cv2.QRCodeDetector()
pageno = pagenum
assignment = {}
@ -56,31 +67,44 @@ def read_qrcodes(pdfdoc, inventory, pagenum=0) :
kernel = np.ones((3,3),dtype=np.uint8)
ret,thresh = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
thresh=cv2.bitwise_not(cv2.dilate(cv2.erode(cv2.bitwise_not(thresh),kernel,iterations=1),kernel,iterations=1))
data = qcd.detectAndDecodeMulti(thresh)
if data[0] == True and data[1][0]!='':
assignment[pageno] = data[1]
data = []
for k in range(4) :
dat = qcd.detectAndDecodeMulti(np.rot90(thresh,k))
if dat[0] == True :
data += [dat[1]]
if len(set(data)) == 1 and data[0]!=('',):
print(data)
assignment[pageno] = data[0]
newdoc = fitz.open()
newdoc.insert_pdf(doc,from_page=indx, to_page=indx, start_at=-1, rotate=-1, links=True, annots=True)
newbytes = newdoc.tobytes()
newbytes = newdoc.tobytes(garbage=4,deflate=True,deflate_images=True, deflate_fonts=True)
try :
newfilename = student_inventory[data[1][0]]
except KeyError :
print('key error', pageno)
pageno += 1
continue
except IndexError :
print('index error', pageno, data)
else :
with open('/home/tomtaylor/exams_/quiz2/'+student_inventory[data[1][0]], 'wb') as f:
'''it would be good to downsample this for smaller filesize'''
with open('/path/to/directory/to/store/student/quizzes/'+newfilename, 'wb') as f:
f.write(newbytes)
else :
weirds += [pageno]
print("I can't read the qr code at page number " + str(pageno+1) +", could you enter the filename for me?")
img = Image.fromarray(thresh.astype('uint8'))
'''we want to keep an eye on any unreadable qr codes so we can keep track of what goes wrong'''
img.save('/path/to/store/weird/qrs/'+str(gmtime().tm_yday)+'_'+str(pageno)+'.jpg')
img.show()
newfilename = input('page '+str(pageno+1)+'-->')
newdoc = fitz.open()
newdoc.insert_pdf(doc,from_page=indx, to_page=indx, start_at=-1, rotate=-1, links=True, annots=True)
newbytes = newdoc.tobytes()
with open('/home/tomtaylor/exams_/quiz2/'+str(pageno)+'.pdf', 'wb') as f:
with open('/path/to/directory/to/store/student/quizzes/' + newfilename, 'wb') as f:
f.write(newbytes)
img = Image.fromarray(thresh.astype('uint8'))
img.show()
pageno += 1
return (assignment, weirds, pageno)
@ -89,7 +113,7 @@ def read_qrcodes(pdfdoc, inventory, pagenum=0) :
if __name__=='__main__' :
inventory = []
outp = {}
assignment,weirds,pageno = read_qrcodes('/path/to/yourquiz_scan.pdf', '/.csv')
assignment,weirds,pageno = read_qrcodes('/path/to/scanned/quizzes/somefilename.pdf', '/path/to/inventory/file/q4_inventory_mat343.txt')
print('pageno', pageno)
for ky,val in assignment.items() :
outp[ ky ] = val