Embedded_game/QR/识别QR颜色.py

88 lines
2.3 KiB
Python
Raw Normal View History

2025-01-02 12:48:11 +08:00
# -*- coding: utf-8 -*-
# @File : 识别QR颜色.py
# @Author : len
# @Time : 2024/1/14 20:46
import cv2
import numpy as np
def analyze_qrcode_color(image_path):
# 读取图像
image = cv2.imread(image_path)
# 获取图像尺寸
height, width, _ = image.shape
# 计算中心四分之一区域的坐标
x = width // 4
y = height // 4
w = width // 2
h = height // 2
# 提取二维码区域 (ROI)
qrcode_roi = image[y:y+h, x:x+w]
# 转换到 HSV 色彩空间
hsv = cv2.cvtColor(qrcode_roi, cv2.COLOR_BGR2HSV)
# 提高饱和度,以便非白色部分在阈值处理中更加明显
h, s, v = cv2.split(hsv)
s = cv2.add(s, 50) # 增加饱和度
# 应用阈值处理
_, thresholded = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 寻找阈值图像的轮廓
contours, _ = cv2.findContours(thresholded, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 在 ROI 上绘制轮廓
# 注意:这里我们绘制的是彩色的轮廓,所以需要确保 qrcode_roi 是彩色的
cv2.drawContours(qrcode_roi, contours, -1, (0, 255, 0), 2)
# 显示二维码区域
cv2.imshow("img", qrcode_roi)
cv2.imshow("thresholded", thresholded)
# 等待按键后关闭窗口
cv2.waitKey(0)
# 将ROI转换为HSV色彩空间
hsv_roi = cv2.cvtColor(qrcode_roi, cv2.COLOR_BGR2HSV)
# 计算ROI区域的平均颜色
average_color_per_row = np.average(hsv_roi, axis=0)
average_color = np.average(average_color_per_row, axis=0)
average_color = np.uint8([[average_color]])
# 将平均颜色转换回BGR色彩空间以便显示
average_color_bgr = cv2.cvtColor(average_color, cv2.COLOR_HSV2BGR)
average_color_bgr = average_color_bgr[0][0]
# 创建一个显示平均颜色的小矩形
color_image = np.zeros((50, 50, 3), np.uint8)
color_image[:] = average_color_bgr
# 显示平均颜色
cv2.imshow("Average Color", color_image)
# 等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
return average_color_bgr
# 使用示例
# image_path: 图像文件路径
image_path = r'D:\Code\Python\Embedded_game\QR\android_img\QR\9.jpg'
color = analyze_qrcode_color(image_path)
print("二维码的平均颜色为 (BGR):", color)