Я работаю над проектом с использованием Python (3.7) и OpenCV, в котором у меня есть изображение (снятое с помощью камеры) документа с размещенным на нем QR-кодом.
Этот QR-код Код имеет 6 переменных соответственно:
Размер изображения QR-кода
Верх
справа
Низ
Слева
Единица
Последнее обновление:
Вот шаги, которые мне нужно выполнить в том же порядке:
- Определение кода qr и декодирование чтобы прочитать значения размера
- Итак, если размер QR-кода (изображения) не равен указанному в нем размеру, то масштабируйте изображение, чтобы оно равнялось обоим значениям размера.
- Затем обрежьте изображение со всех сторон от изображения QR-кода в соответствии со значениями, указанными в qr-коде.
Я пробовал этот код:
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()
Приведенный выше код дает rror as: final_img = cv2.imwrite ("finalized_image.jpg", roi) cv2.error: OpenCV (4.2.0) / Пользователи / travis / build / skvark / opencv-python / opencv / modules / imgcodecs / src /loadave. cpp: 715: ошибка: (-215: подтверждение не выполнено)! _Img.empty () в функции 'imwrite'
Конец последнего обновления:
Пример декодированной информации о QR-коде: 100, 20, 40, 60, 20, px
Теперь мне нужно определить QR-код по изображению этого документа и на первом этапе мне нужно сравнить размер QR-кода в захваченном изображении документа с размером, который указан в декодированной информации, например, если в захваченном изображении размер QR-изображения составляет 90X90 пикселей, а размер из декодированной информации равен 100X100px нам нужно сравнить это.
Затем, на втором шаге, я должен обрезать полное изображение, используя переменные Top, Right, Bottom & Left соответственно. В соответствии с приведенным выше примером нам нужно обрезать изображение с позиции обнаруженного QR-кода до 20px Top, 40px Right, 60px Bottom и 20px Right. Я добавил пример изображения ниже.
Я сделал для декодирования информации QR-кода, но как я могу взять обнаруженную область QR-кода в качестве отдельного изображения и сравнить ее размер с указанным размером, а затем обрезать изображение соответственно?
Вот что я пробовал до сих пор:
import cv2
image = cv2.imread('/Users/abdul/PycharmProjects/QScanner/images/second.jpg')
qrCodeDetector = cv2.QRCodeDetector()
decodedText, points, _ = qrCodeDetector.detectAndDecode(image)
qr_data = decodedText.split(',')
qr_size = qr_data[0]
top = qr_data[1]
right = qr_data[2]
bottom = qr_data[3]
left = qr_data[4]
print(f'Size: {qr_size}' + str(qr_data[5]))
print(f'Top: {top}')
print(f'Right: {right}')
print(f'Bottom: {bottom}')
print(f'Left: {left}')
if points is not None:
pts = len(points)
print(pts)
for i in range(pts):
nextPointIndex = (i+1) % pts
cv2.line(image, tuple(points[i][0]), tuple(points[nextPointIndex][0]), (255,0,0), 5)
print(points[i][0])
print(decodedText)
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("QR code not detected")
Вот пример изображения:
и вот пример входного изображения: