88 lines
2.3 KiB
Python
88 lines
2.3 KiB
Python
|
# -*- 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)
|