# -*- 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)