#!/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
网友评论