吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2416|回复: 8
收起左侧

[Python 原创] 使用python和opencv实现的颜色位置定位与具体色值提取

  [复制链接]
lucklys 发表于 2023-9-1 17:41

示例代码是识别黄色和粉色区域,然后提取所有区域中的最大区域块 然后提取该区域块的平均色值。
[Python] 纯文本查看 复制代码
import cv2
import numpy as np

# 读取图像
# image = cv2.imread("./test.png")
image = cv2.imread("./t2.jpg")
ball_color = ['yellow', 'pink'] # 需要识别的颜色 支持多个颜色
color_dist = {
    'pink': {'Lower': np.array([150, 43, 46]), 'Upper': np.array([175, 255, 255])},
    'yellow': {'Lower': np.array([21, 43, 46]), 'Upper': np.array([34, 255, 255])},
    'purple': {'Lower': np.array([125, 43, 46]), 'Upper': np.array([155, 255, 255])}
}

gs_frame = cv2.GaussianBlur(image, (5, 5), 0)  # 高斯模糊
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)  # 转化成HSV图像
erode_hsv = cv2.erode(hsv, None, iterations=2)  # 腐蚀 粗的变细
colorArr = []
for colorValue in ball_color: #获取所有匹配的区域块
    inRange_hsv = cv2.inRange(erode_hsv, color_dist[colorValue]['Lower'], color_dist[colorValue]['Upper'])
    c = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    colorArr += c
mask = max(colorArr, key=cv2.contourArea) #获取最大色块
rect = cv2.minAreaRect(mask)
box = cv2.boxPoints(rect)
box = np.intp(box)

# 计算边界框的中心点坐标
center_x = int((box[0][0] + box[2][0]) / 2)
center_y = int((box[0][1] + box[2][1]) / 2)

# 随机生成20个点位
points = []
for _ in range(20):
    x = np.random.randint(center_x - 8, center_x + 8)
    y = np.random.randint(center_y - 8, center_y + 8)
    points.append((x, y))

# 计算20个点位的平均颜色值
avg_color = np.zeros(3)
for point in points:
    color = hsv[point[1], point[0]]
    avg_color += color
avg_color = tuple(map(int, avg_color / len(points)))

# 打印平均颜色值
print("平均颜色值:", avg_color)

# 判断平均颜色值接近黄色还是接近紫色
yellow_dist = np.linalg.norm(avg_color - color_dist['yellow']['Lower'])
purple_dist = np.linalg.norm(avg_color - color_dist['purple']['Lower'])

# 接口应在这里返回结果
if yellow_dist < purple_dist:
    print("平均颜色值接近黄色----阴性")

else:
    print("平均颜色值接近紫色----阳性")

# 绘制矩形和随机点位
cv2.drawContours(image, [np.intp(box)], -1, (0, 255, 255), 2)
for point in points:
    cv2.circle(image, point, 3, (0, 0, 255), -1)

# 显示图像
cv2.namedWindow("img", cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
cv2.imshow('img', image)
cv2.waitKey(0)


示例图片



示例结果




这个东西感觉并不准确 但是也没有找到好的方法,小白不怎么会写python。 想要把这个代码做成接口形式,试了试不知道为什么跑不起来。postman 传了图片但是断点查看并没有图片,不知道咋回事

免费评分

参与人数 2吾爱币 +7 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
crary06 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
moruye 发表于 2023-9-1 21:27
提示: 作者被禁止或删除 内容自动屏蔽
gangdaomeimei 发表于 2023-9-1 23:12
lq2007 发表于 2023-9-1 23:36
感谢感谢,顺便学习学习。感觉还是系统学习opencv
echoaku 发表于 2023-9-2 09:25
厉害,支持一波
yu520 发表于 2023-9-3 13:18
研究一下,跟着学习 ,学习。
jianxin327 发表于 2024-1-6 08:40
学习一下,谢谢
voxmax 发表于 2024-1-14 16:19
在大图下或者复杂图下不太好用,但是在区域色块明显和搜索小图的情况下应该挺好用的。 作为最近跟小目标打交道的我来说,yolov8最好,这是实践下来的结果
lanbior 发表于 2024-1-26 09:11
感谢分享,回头按照楼主的试试
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表