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