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

检测特定颜色的物体

作者: 一如百象 | 来源:发表于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