使用python和opencv实现的颜色位置定位与具体色值提取
示例代码是识别黄色和粉色区域,然后提取所有区域中的最大区域块 然后提取该区域块的平均色值。
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(), 'Upper': np.array()},
'yellow': {'Lower': np.array(), 'Upper': np.array()},
'purple': {'Lower': np.array(), 'Upper': np.array()}
}
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['Lower'], color_dist['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 + box) / 2)
center_y = int((box + box) / 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]
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, , -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)
示例图片
https://attach.52pojie.cn//forum/202309/01/173900y5njjj3ynayh3jyn.jpg?lhttps://attach.52pojie.cn//forum/202309/01/173902tbzh0zqdrqebtuhq.jpg?lhttps://attach.52pojie.cn//forum/202309/01/173904y55nnnn6en44ru96.jpg?l
示例结果
https://attach.52pojie.cn//forum/202309/01/173823e833zyy8iyzjsjsq.png?l
这个东西感觉并不准确 但是也没有找到好的方法,小白不怎么会写python。 想要把这个代码做成接口形式,试了试不知道为什么跑不起来。postman 传了图片但是断点查看并没有图片,不知道咋回事 加油,楼主,感觉你写的挺好的 感谢感谢,顺便学习学习。感觉还是系统学习opencv 厉害,支持一波{:1_921:} 研究一下,跟着学习 ,学习。 学习一下,谢谢 在大图下或者复杂图下不太好用,但是在区域色块明显和搜索小图的情况下应该挺好用的。 作为最近跟小目标打交道的我来说,yolov8最好,这是实践下来的结果 感谢分享,回头按照楼主的试试
页:
[1]