qrcode_tool.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import cv2
  2. def detect_and_decode_qr_code(img_path, watermark_annotation):
  3. """
  4. 从指定图片检测和提取二维码
  5. :param img_path: 指定图片位置
  6. :param watermark_annotation: 二维码嵌入位置
  7. :return: (二维码信息,二维码位置)
  8. """
  9. image = cv2.imread(img_path)
  10. # 获取图像的宽度和高度
  11. img_height, img_width = image.shape[:2]
  12. # 解包watermark_annotation中的信息
  13. x_center, y_center, w, h, watermark_class_id = watermark_annotation
  14. # 将归一化的坐标转换为图像中的实际像素坐标
  15. x_center = int(x_center * img_width)
  16. y_center = int(y_center * img_height)
  17. w = int(w * img_width)
  18. h = int(h * img_height)
  19. # 计算边界框的左上角和右下角坐标
  20. x1 = int(x_center - w / 2)
  21. y1 = int(y_center - h / 2)
  22. x2 = int(x_center + w / 2)
  23. y2 = int(y_center + h / 2)
  24. # 提取出对应区域的图像部分
  25. roi = image[y1:y2, x1:x2]
  26. # 初始化二维码检测器
  27. qr_code_detector = cv2.QRCodeDetector()
  28. # 检测并解码二维码
  29. decoded_text, points, _ = qr_code_detector.detectAndDecode(roi)
  30. if points is not None:
  31. # 将点坐标转换为整数类型
  32. points = points[0].astype(int)
  33. # 根据原始图像的区域偏移校正点的坐标
  34. points[:, 0] += x1
  35. points[:, 1] += y1
  36. return decoded_text, points
  37. else:
  38. return None, None