怎么通过hsv定位到不同的颜色,并且画圆

该博客介绍了如何利用OpenCV和HSV色彩空间来识别和定位不同颜色,如红色、绿色、蓝色、黄色和紫色的小球,并通过绘制圆圈将它们圈出。首先通过摄像头捕获图像,然后转换为HSV格式,定义颜色的阈值范围,通过色彩过滤找到目标颜色的轮廓,最后使用最小外接圆方法确定小球的位置并画圆。
摘要由CSDN通过智能技术生成

怎么通过hsv定位到不同的颜色,并且画圆

首先我们先通过OpenCV来获取当前图片,从而获取到它们的hsv阈值

import cv2
import numpy as np
from matplotlib import pyplot as plt

cap = cv2.VideoCapture(0)
while(1):
    # 获得图片
    ret, frame = cap.read()
    # 展示图片
    cv2.imshow("capture", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        # 存储图片
        cv2.imwrite("red.jpg", frame)
        break

当通过调用电脑摄像头,按q拍摄完之后,这时我们先读取到我们刚刚拍摄到的图片,然后模拟鼠标点击事件来获取来hsv指

image=cv2.imread('red.jpg')
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDOWN: #定义一个鼠标左键按下去的事件
        print(HSV[y,x])

cv2.imshow("imageHSV",HSV)
cv2.imshow('image',image)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)

image-20201116154738390

这时通过获取到的阈值,我们可以得知,我们电脑摄像头红色的阈值的最高和最低

low_red = [2,100,100]

high_red = [4,255,255]

再通过准确的阈值大小来设定色层,最后识别多种颜色的小球,并且用不同的颜色把这些小球圈出来

image-20201116155228497

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
ret = cap.set(3, 640)  # 设置帧宽
ret = cap.set(4, 480)  # 设置帧高


def camera():  # 检查摄像头是否正常启动
    while True:
        ret, frame = cap.read()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # 转换为HSV空间
        lower_green = np.array([65, 43, 46])  # 设定绿色的阈值下限
        upper_green = np.array([80, 255, 255])  # 设定绿色的阈值上限
        lower_blue = np.array([95, 43, 46])  # 设定蓝色的阈值下限
        upper_blue = np.array([105, 255, 255])  # 设定蓝色的阈值上限
        lower_red = np.array([2, 100, 100])  # 设定红色的阈值下限
        upper_red = np.array([4, 255, 255])  # 设定红色的阈值上限
        lower_yellow = np.array([20, 43, 46])  # 设定黄色阈值下限
        upper_yellow = np.array([25, 255, 255])  # 设定黄色的阈值上限
        lower_purple = np.array([130, 43, 46])  # 设定紫色的阈值下限
        upper_purple = np.array([155, 255, 255])  # 设定紫色的阈值上限
        #设定一个颜色层
        mask = cv2.inRange(hsv,lower_green,upper_green)
        mask2 = cv2.inRange(hsv,lower_blue,upper_blue)
        mask3 = cv2.inRange(hsv, lower_purple, upper_purple)
        mask4 = cv2.inRange(hsv, lower_red, upper_red)
        mask5 = cv2.inRange(hsv, lower_yellow, upper_yellow)
        #确定小球的框框
        contourareas = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        contourareas2 = cv2.findContours(mask2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        contourareas3 = cv2.findContours(mask3.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        contourareas4 = cv2.findContours(mask4.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        contourareas5 = cv2.findContours(mask5.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
        if len(contourareas) >0:
            #从最大的框框来确定小球的内切圆
            circle = max(contourareas,key=cv2.contourArea)
            #再从内切圆里面确定小球的圆心和半径
            ((x,y),z) = cv2.minEnclosingCircle(circle)
            x = int(x)
            y = int(y)
            z = int(z)
            print((x,y),'radius:%d' % z)
            if z >25:
                cv2.circle(frame,(x,y),z,(0,255,0),5)
        if len(contourareas2) >0:
            circle2 = max(contourareas2,key=cv2.contourArea)
            ((x2,y2),z2) = cv2.minEnclosingCircle(circle2)
            x2 = int(x2)
            y2 = int(y2)
            z2 = int(z2)
            print((x2,y2),'radius:%d' % z2)
            if z2 >25:
                cv2.circle(frame,(x2,y2),z2,(65,105,255),5)
        if len(contourareas3) >0:
            circle3 = max(contourareas3,key=cv2.contourArea)
            ((x3,y3),z3) = cv2.minEnclosingCircle(circle3)
            x3 = int(x3)
            y3 = int(y3)
            z3 = int(z3)
            print((x3,y3),'radius:%d' % z3)
            if z3 >25:
                cv2.circle(frame,(x3,y3),z3,(160,32,240),5)

        if len(contourareas4) >0:
            circle4 = max(contourareas4,key=cv2.contourArea)
            ((x4,y4),z4) = cv2.minEnclosingCircle(circle4)
            x4 = int(x4)
            y4 = int(y4)
            z4 = int(z4)
            print((x4,y4),'radius:%d' % z4)
            if z4 >25:
                cv2.circle(frame,(x4,y4),z4,(255,0,0),5)
        if len(contourareas5) >0:
            circle5 = max(contourareas5,key=cv2.contourArea)
            ((x5,y5),z5) = cv2.minEnclosingCircle(circle5)
            x5 = int(x5)
            y5 = int(y5)
            z5 = int(z5)
            print((x5,y5),'radius:%d' % z5)
            if z5 >25:
                cv2.circle(frame,(x5,y5),z5,(255,255,0),5)
        cv2.imshow('camera',frame)
        key = cv2.waitKey(1) & 0xff
        if key == ord('q'):
            break

if __name__ == '__main__':

    camera()

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有猫腻妖

你的鼓励是我更新的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值