Python:色块检测追踪以及打印中心坐标

一、一种色块的监测追踪以及打印中心坐标

from collections import  deque  
import numpy as np   
import cv2  
import time  
  
redLower = np.array([0, 80, 50]) #设定红色阈值,HSV空间 
redUpper = np.array([8, 255, 220])  
mybuffer = 64  #初始化追踪点的列表 
pts = deque(maxlen=mybuffer)  
#打开摄像头
if __name__ == '__main__':
    cv2.namedWindow("camera",1)
    video="http://192.168....:8081/"   #自己IP摄像头的地址
    camera =cv2.VideoCapture(video) 
time.sleep(3)#等待两秒

while True:             #遍历每一帧,检测红色瓶盖
    #读取帧
    (ret, frame) = camera.read()
    if not ret:
        print ('No Camera')
        break  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)   #转到HSV空间   
    mask = cv2.inRange(hsv, redLower, redUpper)  #根据阈值构建掩膜
    mask = cv2.erode(mask, None, iterations=2)  #腐蚀操作    
    mask = cv2.dilate(mask, None, iterations=2)  #膨胀操作,其实先腐蚀再膨胀的效果是开运算,去除噪点 
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  #轮廓检测   
    center = None  #初始化瓶盖圆形轮廓质心
    #如果存在轮廓  
    if len(cnts) > 0:  
        #找到面积最大的轮廓  
        c = max(cnts, key = cv2.contourArea)  
        #确定面积最大的轮廓的外接圆  
        ((center_x, center_y), radius) = cv2.minEnclosingCircle(c)  
        #计算轮廓的矩  
        M = cv2.moments(c)  
        #计算质心  
        cv2.circle(frame, (int(center_x), int(center_y)), int(radius), (0, 255, 255), 2)  
        cv2.circle(frame, center, 5, (0, 0, 255), -1)
        print('红色色块的中心坐标',(int(center_x),int(center_y)))
    cv2.imshow('Frame', frame)      
    k = cv2.waitKey(5)&0xFF  #键盘检测,检测到esc键退出
    if k == 27:  
        break  
camera.release()  #摄像头释放 
cv2.destroyAllWindows()#销毁所有窗口 


在这里插入图片描述
对于IP摄像头陌生的同学可以看一下我之前的一篇博客https://blog.csdn.net/weixin_45870610/article/details/104970299

二、两种色块的监测追踪以及打印中心坐标

from collections import  deque  
import numpy as np   
import cv2  
import time  
  
redLower = np.array([156, 43, 46]) #设定红色阈值,HSV空间 
redUpper = np.array([180, 255, 255])
blueLower = np.array([100, 43, 46])
blueUpper = np.array([124, 255, 255])
mybuffer = 64  #初始化追踪点的列表 
pts = deque(maxlen=mybuffer)  
if __name__ == '__main__':
    cv2.namedWindow("camera",1)
    video="http://192.168....:8081/" #这里要改成你自己的IP摄像头的地址  
    camera =cv2.VideoCapture(video) 
time.sleep(3)#等待两秒
while True:             #遍历每一帧,检测红色瓶盖
    #读取帧
    (ret, frame) = camera.read()
    if not ret:
        print ('No Camera')
        break  
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)   #转到HSV空间   
    mask1 = cv2.inRange(hsv, redLower, redUpper)  #根据阈值构建掩膜
    mask2 = cv2.inRange(hsv, blueLower, blueUpper)    
    mask1 = cv2.erode(mask1, None, iterations=2)  #腐蚀操作
    mask2 = cv2.erode(mask2, None, iterations=2)    
    mask1 = cv2.dilate(mask1, None, iterations=2)#膨胀操作,其实先腐蚀再膨胀的效果是开运算,去除噪点
    mask2 = cv2.dilate(mask2, None, iterations=2)    
    cnts1 = cv2.findContours(mask1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]  #轮廓检测
    cnts2 = cv2.findContours(mask2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]    
    center = None  #初始化瓶盖圆形轮廓质心
    #如果存在轮廓  
    if len(cnts1) > 0:    
        c = max(cnts1, key = cv2.contourArea) #找到面积最大的轮廓   
        ((red_x, red_y), radius) = cv2.minEnclosingCircle(c)  #确定面积最大的轮廓的外接圆  
        M = cv2.moments(c)  #计算轮廓的矩  
        cv2.circle(frame, (int(red_x), int(red_y)), int(radius), (0, 255, 255), 2)  #计算质心
        cv2.circle(frame, center, 5, (0, 0, 255), -1)
        print('红:',(int(red_x),int(red_y)))
    if len(cnts2) > 0:    
        c = max(cnts2, key = cv2.contourArea)  
        ((blue_x, blue_y), radius) = cv2.minEnclosingCircle(c)  
        M = cv2.moments(c)  
        cv2.circle(frame, (int(blue_x), int(blue_y)), int(radius), (0, 0, 255), 2)  
        cv2.circle(frame, center, 5, (255, 0, 0), -1)
        print('蓝:',(int(blue_x),int(blue_y)))    
    cv2.imshow('Frame', frame)      
    k = cv2.waitKey(5)&0xFF  #键盘检测,检测到esc键退出
    if k == 27:  
        break  
camera.release()  #摄像头释放 
cv2.destroyAllWindows()#销毁所有窗口 



'''
三种色块的:可以把这些加进去,道理是相同的
greenLower = np.array([35, 43, 46])
greenUpper = np.array([77, 255, 255])
mask3 = cv2.inRange(hsv, greenLower, greenUpper)
mask3 = cv2.erode(mask3, None, iterations=2)
mask3 = cv2.dilate(mask3, None, iterations=2)
cnts3 = cv2.findContours(mask3.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
if len(cnts3) > 0:    
    c = max(cnts3, key = cv2.contourArea)  
    ((green_x, green_y), radius) = cv2.minEnclosingCircle(c)  
    M = cv2.moments(c)  
    cv2.circle(frame, (int(green_x), int(green_y)), int(radius), (255, 0, 0), 2)  
    cv2.circle(frame, center, 5, (0, 255, 0), -1)
    print('绿:',(int(green_x),int(green_y)))
'''

在这里插入图片描述
在这里插入图片描述这里大家要尽量找圆形的物体,家里实在找不到圆绿的了哈哈,不规则的物体的话得出的数据还是会有误差的;还有一种情况是没有办法识别出红色,但你觉得他就是红色的物体,那你可以适当调整一下HSV值,就没问题了

哈哈,一看就是初级菜鸟写的代码,希望对大家有所帮助,因为我最终的目标不是识别色块,所以还要进行更进一步的学习,所以这个博客之后还会更新,尽请期待吧。
有什么需不对的,或者需要改进的地方,还希望各位大神可以指正。在这里插入图片描述

要使用ROS和OpenCV实现二维码检测,可以按照以下步骤进行操作: 1. 安装ROS和OpenCV:首先,确保你已经安装了ROS和OpenCV。你可以通过以下命令来安装它们: ```shell sudo apt-get install ros-<distro>-opencv ``` 其中,`<distro>`是你正在使用的ROS发行版的名称,例如`melodic`或`noetic`。 2. 创建ROS包:在ROS工作空间中创建一个新的ROS包,你可以使用以下命令: ```shell cd ~/catkin_ws/src catkin_create_pkg qr_code_detection roscpp rospy cv_bridge sensor_msgs ``` 这将在`~/catkin_ws/src`目录下创建一个名为`qr_code_detection`的ROS包,并添加所需的依赖项。 3. 下载二维码检测节点:下载并将二维码检测节点添加到ROS包中。你可以使用以下命令: ```shell cd ~/catkin_ws/src/qr_code_detection git clone https://github.com/ros-perception/opencv_apps.git ``` 这将在`~/catkin_ws/src/qr_code_detection`目录下创建一个名为`opencv_apps`的文件夹,并将二维码检测节点添加到其中。 4. 构建ROS包:在ROS工作空间中构建ROS包,你可以使用以下命令: ```shell cd ~/catkin_ws catkin_make ``` 这将编译ROS包并生成可执行文件。 5. 运行二维码检测节点:使用以下命令来运行二维码检测节点: ```shell rosrun qr_code_detection qr_code_detection_node ``` 这将启动二维码检测节点,并开始检测摄像头图像中的二维码。 请注意,以上步骤假设你已经连接了一个摄像头,并且ROS已经正确配置。如果你没有连接摄像头,你可以使用ROS提供的图像仿真工具来模拟摄像头图像。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

信奥教练橙子

你的鼓励将是我的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值