Python OpenCV изменяет размер изображения, читая QR-код, размещенный на изображении - PullRequest
0 голосов
/ 26 марта 2020

Я работаю над проектом с использованием Python (3.7) и OpenCV, в котором у меня есть изображение документа с размещенным на нем QR-кодом.

Этот QR-код имеет 6 значений соответственно, как :

  1. Размер изображения QR-кода

  2. Верх

  3. Справа

  4. Низ

  5. Слева

  6. Единица

Вот шаги, которые мне нужно выполнить в том же порядке:

  1. Определите QR-код и расшифруйте его, чтобы прочитать значения размера
  2. Итак, если размер QR-кода (изображения) равен не равный указанному в нем размеру, затем масштабируйте изображение, чтобы оно равнялось обоим значениям размера.
  3. Затем обрезайте изображение во все стороны от изображения QR-кода в соответствии со значениями, указанными внутри QR-кода.

и вот пример входного изображения:

enter image description here

Вот что я пробовал до сих пор:

def decodeAndCrop(inputImage):
    print(str(inputImage))
    image = cv2.imread(str(inputImage))
    qrCodeDetector = cv2.QRCodeDetector()
    decodedText, points, _ = qrCodeDetector.detectAndDecode(image)
    qr_data = decodedText.split(",")
    print("qr data from fucntion: {}".format(qr_data))
    if points is not None:
        pts = len(points)
    # print(pts)
    for i in range(pts):
        nextPointIndex = (i + 1) % pts
        if str(inputImage) == "scaled_img.jpg":
            cv2.line(
                image,
                tuple(points[i][0]),
                tuple(points[nextPointIndex][0]),
                (255, 0, 0),
                5,
            )
        print(points[i][0])
        width = int(
            math.sqrt(
                (points[0][0][0] - points[1][0][0]) ** 2
                + (points[0][0][1] - points[1][0][1]) ** 2
            )
        )
        height = int(
            math.sqrt(
                (points[1][0][0] - points[2][0][0]) ** 2
                + (points[1][0][1] - points[2][0][1]) ** 2
            )
        )
        print("height and width after scaling: {} {}".format(height, width))
        if not str(inputImage) == "scaled_img.jpg":
            scaled_img = None
            if width == qr_data[0] and height == qr_data[0]:
                print("Sizes are equal")
                # Add the extension values to points and crop
                y = int(points[0][0][1]) - int(qr_data[1])
                x = int(points[0][0][0]) - int(qr_data[4])
                roi = image[
                    y : y + height + int(qr_data[3]), x : x + width + int(qr_data[2])
                ]
                scaled_img = cv2.imwrite("scaled_img.jpg", roi)
                return scaled_img
            else:
                print(
                    "Width and height  "
                    + str(width)
                    + "x"
                    + str(height)
                    + "  not equal to "
                    + str(qr_data[0])
                    + "x"
                    + str(qr_data[0])
                )
                if height > int(qr_data[0]):
                    scale_width = int(width) - int(qr_data[0])
                    scale_height = int(height) - int(qr_data[0])
                    print(f"scaled width: {scale_width} scaled height: {scale_height}")
                    dimension = (scale_width, scale_height)
                    scaled_img = cv2.resize(
                        image, dimension, interpolation=cv2.INTER_AREA
                    )
                    print("new img dims: {}".format(scaled_img.shape))
                    cv2.imshow("scaled image:", scaled_img)
                    cv2.imwrite("scaled_img.jpg", scaled_img)
                elif height < int(qr_data[0]):
                    scale_width = int(qr_data[0]) - width
                    scale_height = int(qr_data[0] - height)
                    print(f"scaled width: {scale_width} scaled height: {scale_height}")
                    dimension = (scale_width, scale_height)
                    scaled_img = cv2.resize(
                        image, dimension, interpolation=cv2.INTER_AREA
                    )
                    print("new img dims: {}".format(scaled_img.shape))
                    cv2.imshow("scaled image:", scaled_img)
                    cv2.imwrite("scaled_img.jpg", scaled_img)
                    cv2.imshow("final output:", roi)
                return scaled_img

        else:
            y = int(points[0][0][1]) - int(qr_data[1])
            x = int(points[0][0][0]) - int(qr_data[4])
            print(" x and y")
            print(x)
            print(y)
            roi = image[
                y : y + height + int(qr_data[3]), x : x + width + int(qr_data[2])
            ]
            final_img = cv2.imwrite("finalized_image.jpg", roi)
            cv2.imshow("finalized image:", final_img)
            return final_img


if __name__ == "__main__":
    image_to_crop = decodeAndCrop("example_input_1.jpg")
    final_image = decodeAndCrop("scaled_img.jpg")
    cv2.imshow("Cropped:", image_to_crop)
    # cv2.imshow("Final: ", final_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

выдает ошибку, которая Сохранить конечный результат как:

final_img = cv2.imwrite ("finalized_image.jpg", roi) cv2.error: OpenCV (4.2.0) / Users / travis / build / skvark / opencv -python / opencv / modules / imgcodecs / src / loadave. cpp: 715: ошибка: (-215: подтверждение не выполнено)! _img.empty () в функции 'imwrite'

1 Ответ

0 голосов
/ 26 марта 2020

Какая библиотека является переменной cv2? Вам нужно поймать исключение (Ошибка) Попробуйте запустить

import math
import cv2


    def decodeAndCrop(inputImage):
        print(str(inputImage))
        image = cv2.imread(str(inputImage))
        qrCodeDetector = cv2.QRCodeDetector()
        while True:
            try:
                decodedText, points, _ = qrCodeDetector.detectAndDecode(image)
                qr_data = decodedText.split(",")
                print("qr data from fucntion: {}".format(qr_data))
                if points is not None:
                    pts = len(points)
                # print(pts)
                for i in range(pts):
                    nextPointIndex = (i + 1) % pts
                    if str(inputImage) == "scaled_img.jpg":
                        cv2.line(
                            image,
                            tuple(points[i][0]),
                            tuple(points[nextPointIndex][0]),
                            (255, 0, 0),
                            5,
                        )
                    print(points[i][0])
                    width = int(
                        math.sqrt(
                            (points[0][0][0] - points[1][0][0]) ** 2
                            + (points[0][0][1] - points[1][0][1]) ** 2
                        )
                    )
                    height = int(
                        math.sqrt(
                            (points[1][0][0] - points[2][0][0]) ** 2
                            + (points[1][0][1] - points[2][0][1]) ** 2
                        )
                    )
                    print("height and width after scaling: {} {}".format(height, width))
                    if not str(inputImage) == "scaled_img.jpg":
                        scaled_img = None
                        if width == qr_data[0] and height == qr_data[0]:
                            print("Sizes are equal")
                            # Add the extension values to points and crop
                            y = int(points[0][0][1]) - int(qr_data[1])
                            x = int(points[0][0][0]) - int(qr_data[4])
                            roi = image[
                                y: y + height + int(qr_data[3]), x: x + width + int(qr_data[2])
                                ]
                            scaled_img = cv2.imwrite("scaled_img.jpg", roi)
                            return scaled_img
                            False
                        else:
                            print(
                                "Width and height  "
                                + str(width)
                                + "x"
                                + str(height)
                                + "  not equal to "
                                + str(qr_data[0])
                                + "x"
                                + str(qr_data[0])
                            )
                            if height > int(qr_data[0]):
                                scale_width = int(width) - int(qr_data[0])
                                scale_height = int(height) - int(qr_data[0])
                                print(f"scaled width: {scale_width} scaled height: {scale_height}")
                                dimension = (scale_width, scale_height)
                                scaled_img = cv2.resize(
                                    image, dimension, interpolation=cv2.INTER_AREA
                                )
                                print("new img dims: {}".format(scaled_img.shape))
                                cv2.imshow("scaled image:", scaled_img)
                                cv2.imwrite("scaled_img.jpg", scaled_img)
                            elif height < int(qr_data[0]):
                                scale_width = int(qr_data[0]) - width
                                scale_height = int(qr_data[0] - height)
                                print(f"scaled width: {scale_width} scaled height: {scale_height}")
                                dimension = (scale_width, scale_height)
                                scaled_img = cv2.resize(
                                    image, dimension, interpolation=cv2.INTER_AREA
                                )
                                print("new img dims: {}".format(scaled_img.shape))
                                cv2.imshow("scaled image:", scaled_img)
                                cv2.imwrite("scaled_img.jpg", scaled_img)
                                cv2.imshow("final output:", roi)
                            return scaled_img
                            False

                    else:
                        y = int(points[0][0][1]) - int(qr_data[1])
                        x = int(points[0][0][0]) - int(qr_data[4])
                        print(" x and y")
                        print(x)
                        print(y)
                        roi = image[
                            y: y + height + int(qr_data[3]), x: x + width + int(qr_data[2])
                            ]
                        final_img = cv2.imwrite("finalized_image.jpg", roi)
                        cv2.imshow("finalized image:", final_img)
                        return final_img
                    False
            except:
                print('!inarr.empty: retrying')


    if __name__ == "__main__":
        image_to_crop = decodeAndCrop("example_input_1.jpg")
        final_image = decodeAndCrop("scaled_img.jpg")
        cv2.imshow("Cropped:", image_to_crop)
        # cv2.imshow("Final: ", final_image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
...