美文网首页
检测特定颜色的物体

检测特定颜色的物体

作者: 一如百象 | 来源:发表于2019-03-11 22:00 被阅读0次
#!/usr/lib/python
#coding=utf -8 

import rospy 
from sensor_msgs.msg import Image 
import cv2 
from cv_bridge import CvBridge 
import numpy as np
import time

print("11111")


class Cama():
    
    def __init__(self): 
        print("sdda")

        #rospy.on_shutdown(self.cleanup)

        self.bridge = CvBridge()
        self.image_pub = rospy.Publisher("cv_bridge_image",Image,queue_size=1)

        self.minArea = rospy.get_param("~minArea", 500) 
        self.threshold = rospy.get_param("~threshold", 25)

        self.kernel_2 = np.ones((2,2),np.uint8)#2x2的卷积核
        self.kernel_3 = np.ones((3,3),np.uint8)#3x3的卷积核
        self.kernel_4 = np.ones((4,4),np.uint8)#4x4的卷积核
        

        self.firstFrame = None
        self.test = "Unoccupied"
        print("fdsdf")

        #rospy.init_node('listener', anonymous=True)
        self.image_sub = rospy.Subscriber("/kinect2/hd/image_color",Image,self.image_callback)
        print("tttttttt")
        rospy.spin()


    def image_callback(self,Image):
    # print("c")
    # try:
    #     cv_image = bridge.imgmsg_to_cv2(imgmsg, "bgr8") 

    #     frame = np.array(cv_image, dtype = np.uint8)

    #     print("ccccccc")
    # except CvBridgeError, e:
    #     print e
        print("ddddd")
        

   

        bridge = CvBridge()
        #firstFrame = None

        cv_image = self.bridge.imgmsg_to_cv2(Image, "bgr8") 

        frame = np.array(cv_image, dtype = np.uint8)

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (21,21), 0)
    
        HSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#把BGR图像转换为HSV格式

        # Lower = np.array([20, 20, 20])    #要识别颜色的下限
        # Upper = np.array([30, 255, 255])   #要识别的颜色的上限

        Lower = np.array([35, 43, 46])    #要识别颜色的下限
        Upper = np.array([77, 255, 255])   #要识别的颜色的上限

        #mask是把HSV图片中在颜色范围内的区域变成白色,其他区域变成黑色
        mask = cv2.inRange(HSV, Lower, Upper)
        #下面四行是用卷积进行滤波
        erosion = cv2.erode(mask,self.kernel_4,iterations = 1)
        erosion = cv2.erode(erosion,self.kernel_4,iterations = 1)
        dilation = cv2.dilate(erosion,self.kernel_4,iterations = 1)
        dilation = cv2.dilate(dilation,self.kernel_4,iterations = 1)
        #target是把原图中的非目标颜色区域去掉剩下的图像
        target = cv2.bitwise_and(frame, frame, mask=dilation)
        #将滤波后的图像变成二值图像放在binary中
        ret, binary = cv2.threshold(dilation,127,255,cv2.THRESH_BINARY) 
 
        #在binary中发现轮廓,轮廓按照面积从小到大排列
        im, contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
        p=0
        print("ccccc")
        for i in contours:#遍历所有的轮廓
            x,y,w,h = cv2.boundingRect(i)#将轮廓分解为识别对象的左上角坐标和宽、高
            #在图像上画上矩形(图片、左上角坐标、右下角坐标、颜色、线条宽度)
            if w < 200 and w > 100 and h <200 and h > 100:
                cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,),3)
                #cv2.circle(frame,(x,y),(x+w,y+h),(0,255,),3)
            #给识别对象写上标号
                font=cv2.FONT_HERSHEY_SIMPLEX
                cv2.putText(frame,str(p),(x-10,y+10), font, 1,(0,0,255),2)#加减10是调整字符位置
                p +=1
        print '黄色方块的数量是',p,'个'#终端输出目标数量

        cv2.imshow('target', frame)
        #cv2.imshow('Mask', mask)
        #cv2.imshow("prod", dilation)
        #cv2.imshow('Img', frame)
        #cv2.imwrite('Img.jpg', Img)#将画上矩形的图形保存到当前目录 

        #cv2.imshow('target', binary)
        cv2.waitKey(3) 
    

        # print("sfdasgf")

        # if self.firstFrame is None:
        #     self.firstFrame = gray
        #     print("fsjifkdls")
        #     return 
    
        # print("ccccc")

        # frameDelta = cv2.absdiff(self.firstFrame, gray) #计算当前帧和第一帧的不同
        # thresh = cv2.threshold(frameDelta, self.threshold, 255, cv2.THRESH_BINARY)[1]

        # thresh = cv2.dilate(thresh, None, iterations=2)
        # binary,cnts,hierarchy= cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

        # print("llllllll")


        # for c in cnts:
        #     #如果检测到的区域小于设置值,则忽略
        #     if cv2.contourArea(c) < 255:
        #         continue


        #     (x,y,w,h) = cv2.boundingRect(c)
        #     cv2.rectangle(frame,(x,y),(x+w,y+h),(50.255,50),2)
        #     self.text = "Occupied"

        # cv2.putText(frame,"Status: {}".format(self.text),(10,20),
        #     cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255),2)

        # cv2.imshow("listener", frame) 
        # cv2.waitKey(3) 
    

def test():
    demo=Cama()

    #demo.image_callback(Image)

if __name__ == "__main__":
    rospy.init_node('listener', anonymous=True)
   
    test()

检测特定颜色的物体

#!/usr/bin/env python 
# -*- coding: utf-8 -*-

# __author__ = 'kingking'
# __version__ = '1.0'
# __date__ = '14/07/2017'

import cv2
import numpy as np
import time


if __name__ == '__main__': 

    Img = cv2.imread('/home/jxl/catkin_ws/wgs/bbb.jpg')#读入一幅图像
    kernel_2 = np.ones((2,2),np.uint8)#2x2的卷积核
    kernel_3 = np.ones((3,3),np.uint8)#3x3的卷积核
    kernel_4 = np.ones((4,4),np.uint8)#4x4的卷积核
    print("aaaaa")
    # cv2.imshow('Img', Img)
    # cv2.waitKey(0)
    if Img is not None:#判断图片是否读入
        print("bbbbb")
        HSV = cv2.cvtColor(Img, cv2.COLOR_BGR2HSV)#把BGR图像转换为HSV格式
        '''
        HSV模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)
        下面两个值是要识别的颜色范围
        '''
        Lower = np.array([20, 20, 20])#要识别颜色的下限
        Upper = np.array([30, 255, 255])#要识别的颜色的上限
        #mask是把HSV图片中在颜色范围内的区域变成白色,其他区域变成黑色
        mask = cv2.inRange(HSV, Lower, Upper)
        #下面四行是用卷积进行滤波
        erosion = cv2.erode(mask,kernel_4,iterations = 1)
        erosion = cv2.erode(erosion,kernel_4,iterations = 1)
        dilation = cv2.dilate(erosion,kernel_4,iterations = 1)
        dilation = cv2.dilate(dilation,kernel_4,iterations = 1)
        #target是把原图中的非目标颜色区域去掉剩下的图像
        target = cv2.bitwise_and(Img, Img, mask=dilation)

        # cv2.imshow('target', target)
        # cv2.waitKey(600000)

        #将滤波后的图像变成二值图像放在binary中
        ret, binary = cv2.threshold(dilation,127,255,cv2.THRESH_BINARY) 
        #在binary中发现轮廓,轮廓按照面积从小到大排列
        # cv2.imshow('target', target)
        # cv2.waitKey(0)
        # print("ddddd")
        # contours, hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
        # p=0
        # print("ccccc")
        # for i in contours:#遍历所有的轮廓
        #     x,y,w,h = cv2.boundingRect(i)#将轮廓分解为识别对象的左上角坐标和宽、高
        #     #在图像上画上矩形(图片、左上角坐标、右下角坐标、颜色、线条宽度)
        #     cv2.rectangle(Img,(x,y),(x+w,y+h),(0,255,),3)
        #     #给识别对象写上标号
        #     font=cv2.FONT_HERSHEY_SIMPLEX
        #     cv2.putText(Img,str(p),(x-10,y+10), font, 1,(0,0,255),2)#加减10是调整字符位置
        #     p +=1
        # print '黄色方块的数量是',p,'个'#终端输出目标数量
        cv2.imshow('target', target)
        cv2.imshow('Mask', mask)
        cv2.imshow("prod", dilation)
        cv2.imshow('Img', Img)
        cv2.imwrite('Img.jpg', Img)#将画上矩形的图形保存到当前目录  
        print("bbbbb")
    while True:
        Key = chr(cv2.waitKey(15) & 255)
        if Key == 'q':
            cv2.destroyAllWindows()
            break

相关文章

网友评论

      本文标题:检测特定颜色的物体

      本文链接:https://www.haomeiwen.com/subject/bazljqtx.html