def fromJSON( self,\ strParse ): size = len(strParse) for item in strParse: scanResult = ScanResult() #большой код bigQRCodeData = BigQRCodeData() bigQRCodeData.setDataFromJSON(item["m_BigQRCodeData"]) scanResult.setBigQRCodeData(bigQRCodeData) scanResult.setIdToken(item["m_IdToken"]) scanResult.setStatus(item["m_Status"]) #маленькие коды парсим smallQRCodeList = item["m_SmallQRCodeDataList"] for smallQRCode in smallQRCodeList: smallQRCodeData = SmallQRCodeData() smallQRCodeData.setData(smallQRCode["m_Title"]) lst = [] lst = smallQRCode["m_ResultList"] smallQRCodeData.setResultList(lst) scanResult.addSmallQRCodeData(smallQRCodeData) self.m_ScanResultList.append(scanResult)
def __init__(self): self.m_IdToken = 0 self.m_Status = UNAVAILABLE_SCAN_RESULT_RECORD self.m_BigQRCodeData = BigQRCodeData() self.m_SmallQRCodeDataList = []
def startScan( sourceImage,\ idToken ): imageWorker = ImageWorker( sourceImage,\ PIL_IMAGE ) # Заносим информацию о том, что распознавание НАЧАЛОСЬ # также, создаем объект scanResult, который будет содержать в себе # всю информацию по результату распознавания try: tokenFileWorker = TokenFileWorker() scanResult = ScanResult() scanResult.setIdToken(idToken) scanResult.setStatus(IN_PROGRESS) tokenFileWorker.setScanResult(scanResult) #ВАРИАНТ ГРУБОЙ СИЛЫ coordinateOfQRCode, imageWorker, symData = thirdVariantOfAlgorithm( imageWorker) #sourceImage.save( "check1.png" ) #coordinateOfQRCode, sourceImage, symData = thirdVariantOfAlgorithm( sourceImage, \ # WAS_ROTATED ) sourceImage = imageWorker.getPILImage() #sourceImage.save( "OnlyForm.jpg" ) #sourceImage.save( "check.png" ) if (len(coordinateOfQRCode) > 0): bootomLeftCorners = coordinateOfQRCode[1] bottomRightCorners = coordinateOfQRCode[2] start_x = bottomRightCorners[x] - int( (bottomRightCorners[x] - bootomLeftCorners[x]) / 2) start_y = bottomRightCorners[y] listOfQRCodes, dataList = findAllQRCodeOnColumn( imageWorker, start_x, start_y) if (len(listOfQRCodes) > 0): #выводим и записываем большой QR bigQRCodeData = BigQRCodeData() bigQRCodeData.parseDataFromStr(str(symData)) scanResult.setBigQRCodeData(bigQRCodeData) sys.stdout.write(str(symData) + "\n") #print( symData ) #начинаем вырезать ячейки по каждому коду for i in range(0, int(len(listOfQRCodes) / 2)): #print( dataList[ i ] ) smallQRCodeData = SmallQRCodeData() smallQRCodeData.setData(str(dataList[i])) sys.stdout.write(str(dataList[i]) + "\n") listOfResult = [] #fileNameImageWithCells = FOLDER_IMAGE_WITH_CELLS + \ # str( i ) + \ # IMAGE_FILENAME_IMAGE_WITH_CELLS imgWithCells = getImageWithCells(sourceImage, listOfQRCodes[i * 2 + 1]) thresholdValue = 200 squares, imgWithCellsThresh = find_squares( imgWithCells, imageWorker, thresholdValue) #imageWorker.copyOpenCVImageToPIL(imgWithCellsThresh, 1) #imgWithCells = imgWithCellsThresh #cv2.imwrite("NEW_image_with_cells.jpg", imgWithCells) countOfCells = len(squares) #3 ячейки! cells = [] listOfResult = [] if (countOfCells == 3): #изображения с ячейками for k in range(0, countOfCells): #imgWithCells.save("image_with_cells.jpg") #imageWorker.copyPILImageToOpenCV(imgWithCells) cellImage = getImageByContour( squares[ k ],\ imgWithCellsThresh) #cv2.imwrite("test_cell.jpg", cellImage) imageWorker.copyOpenCVImageToPIL(cellImage, 1) image = prepareCell( imageWorker.getPILImage(), \ sourceImage ) cells.append(image) #image.save( cellFileName ) #image.save("cell.jpg") listOfResult.append(checkImageOnMark(image)) sys.stdout.write(str(listOfResult) + "\n") #print( listOfResult ) else: # Если вдруг, по результатам алгоритма поиска ячеек (по контурам), # их оказалось БОЛЕЕ 3-ех. Тогда вырезаем ВРУЧНУЮ (опираясь на # ИЗВЕСТНОЕ расстояние между ячейками в пикселях. cellsDetector = CellsDetector( sourceImage,\ imgWithCells ) firstCellImg, secondCellImg, thirdCellImg = cellsDetector.start( ) listOfResult.append(checkImageOnMark(firstCellImg)) listOfResult.append(checkImageOnMark(secondCellImg)) listOfResult.append(checkImageOnMark(thirdCellImg)) sys.stdout.write(str(listOfResult) + "\n") smallQRCodeData.setResultList(listOfResult) scanResult.addSmallQRCodeData(smallQRCodeData) scanResult.setStatus(SUCCESS) else: #print( "there is no something about small QR codes :("); sys.stderr.write(str(SMALL_QR_CODES_ARE_NOT_HERE)) scanResult.setStatus(FILED_SMALL_QR_CODE) else: sys.stderr.write(str(FORM_NOT_FOUNDED)) # Не найден большой QR код. scanResult.setStatus(FAILED_BIG_QR_CODE) except BaseException: scanResult.setStatus(FAILED) return scanResult
def thirdVariantOfAlgorithm( imageWorker, \ rotatedStatus = IS_NOT_ROTATED ): global height_big_qr_code global width_big_qr_code sourceImage = imageWorker.getPILImageCopy() height_big_qr_code = getX_PixelsByMillimeters( sourceImage, \ HEIGHT_OF_BIG_QR_CODE ) width_big_qr_code = getY_PixelsByMillimeters( sourceImage, \ WIDTH_OF_BIG_QR_CODE ) #ДИАГОНАЛЬ diagonal = math.sqrt(height_big_qr_code**2 + width_big_qr_code**2) height_big_qr_code = diagonal width_big_qr_code = diagonal #im = Image.open( sourceImageFileName ).convert('L') width_source_image = sourceImage.width height_source_mage = sourceImage.height start_x = int(width_source_image - width_big_qr_code) start_y = 0 symData = "" coordinateOfQRCode = [] imageWorker.copyPILImageToOpenCV(sourceImage) # Пытаемся сперва СРАЗУ обнаружить коды res, coordinateOfQRCode, symData = tryToFindBigQRCodeInFullForm( imageWorker) while (1): if (res == 0): crop_img = crop_image( sourceImage,\ 0,\ start_x,\ start_y,\ width_big_qr_code,\ height_big_qr_code ) imageWorker.copyPILImageToOpenCV(crop_img) for i in range(1, 10): #print( "HI!") threshold = 200 - i * 10 #cv2.imwrite( "JUST_FOR_TEST_OPENCV.jpg", imageWorker.getOpenCVImage()) threshImg = doThreshold( imageWorker.getOpenCVImage(),\ threshold ) imageWorker.copyOpenCVImageToPIL(threshImg) #imageWorker.getPILImage().save("JUST_FOR_TEST_1.jpg") symbols = scanImageForQRCode(imageWorker.getPILImage(), 0) if (len(symbols) > 0): sym = symbols[0] symData = sym.data if (isItBigQRCode(symData)): topLeftCorners, bottomLeftCorners, bottomRightCorners, topRightCorners = [ item for item in sym.locator ] coordinateOfQRCode = topLeftCorners, bottomLeftCorners, bottomRightCorners, topRightCorners break #coordinateOfQRCode = findFirstQRCode( crop_img ) if (len(coordinateOfQRCode) != 0): #print("start_x, y", start_x, start_y) bigQRCodeData = BigQRCodeData() #print( symData ) bigQRCodeData.parseDataFromStr(str(symData)) if (res == 0): coordinateOfQRCode = correctCoordinateOfQRCode( coordinateOfQRCode, start_x, start_y) topLeftCorners, bottomLeftCorners, bottomRightCorners, topRightCorners = coordinateOfQRCode img_with_crop = crop_image( sourceImage, \ 0, \ bottomLeftCorners[x], \ topLeftCorners[y], \ bottomRightCorners[x] - bottomLeftCorners[x], \ bottomLeftCorners[y] - topLeftCorners[y] ) #img_with_crop.save( FOLDER_QR_CODES + # IMAGE_FILENAME_BIG_QR_CODE ) formRotation = FormRotation( sourceImage, \ coordinateOfQRCode ) result, imageRotated, rotationValue = formRotation.start() #сохранение попытки поворота #imageRotated.save("tryToRotate.png") #print( result ) #Если был поворот if (result == 1 and rotatedStatus == IS_NOT_ROTATED): #image = imageRotated #coordinateOfQRCode, sourceImage, symData = thirdVariantOfAlgorithm( image) #widthOfQRCode = bottomRightCorners[x] - bottomLeftCorners[x] #heightOfQRCode = bottomLeftCorners[y] - topLeftCorners[y] xCenterPoint = int(width_source_image / 2) yCenterPoint = int(height_source_mage / 2) #print( "Before getNewPointByCoordinates", coordinateOfQRCode ) # если сработал быстрый алгоритм можно быстро отыскать НОВЫЕ координаты. #print(FAST_ALGORITHM_IS_WORKED) if (FAST_ALGORITHM_IS_WORKED == 0): #print("FAST") imageWorker.copyPILImageToOpenCV(imageRotated) res, coordinateOfQRCode, symData = tryToFindBigQRCodeInFullForm( imageWorker) else: #print("NOT FAST") coordinateOfQRCode = getNewPointByCoordinatesOfCode( coordinateOfQRCode,\ xCenterPoint,\ yCenterPoint,\ rotationValue ) #print( "After getNewPointByCoordinates", coordinateOfQRCode ) #print ( coordinateOfQRCode ) # Это код НЕ первой страницы? if (bigQRCodeData.getPageBit() == str(0)): # корректируем его координаты. #print("CORRECT BIG CODE") coordinateOfQRCode = bigQRCodeIsNotOnTheFirstPage( coordinateOfQRCode,\ imageRotated ) #print ( "NEW",coordinateOfQRCode ) sourceImage, coordinateOfQRCode = detectFormByBigQRCode( imageRotated,\ coordinateOfQRCode ) #print( coordinateOfQRCode ) #crop_img.save("big_qr_code.jpg") break start_x = start_x - int(width_big_qr_code / 10) #Как только дошли до левого края страницы if (start_x < 0): start_x = int(width_source_image - width_big_qr_code) start_y = start_y + int(height_big_qr_code / 10) if ((start_y + int(height_big_qr_code)) >= height_source_mage): break imageWorker.setPILImage(sourceImage) return coordinateOfQRCode, imageWorker, symData