Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    def __init__(self):

        self.m_IdToken = 0
        self.m_Status = UNAVAILABLE_SCAN_RESULT_RECORD
        self.m_BigQRCodeData = BigQRCodeData()
        self.m_SmallQRCodeDataList = []
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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