Color, shape, area
// Some code
import cv2
import rospy
import numpy as np
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
bridge = CvBridge()
def image_colback_color(cv_image):
img_hsv = cv2.cvtColor(cv_image, cv2.COLOR_BGR2HSV)
return img_hsv
img = bridge.imgmsg_to_cv2(rospy.wait_for_message('main_camera/image_raw', Image), 'bgr8')
img_hsv = image_colback_color(img) # BGR to HSV
# masks = dict()
# masks["red"] = cv2.inRange(img_hsv, np.array([175, 0, 0]), np.array([255, 255, 255]))
# masks["yellow"] = cv2.inRange(img_hsv, np.array([28, 0, 0]), np.array([54, 255, 255]))
# masks["black"] = cv2.inRange(img_hsv, np.array([0, 0, 0]), np.array([255, 255, 107]))
# masks["blue"] = cv2.inRange(img_hsv, np.array([116, 0, 0]), np.array([149, 255, 255]))
# masks["green"] = cv2.inRange(img_hsv, np.array([68, 0, 0]), np.array([102, 255, 255]))
# masks["pink"] = cv2.inRange(img_hsv, np.array([167, 0, 0]), np.array([177, 255, 255]))
# masks["grey"] = cv2.inRange(img_hsv, np.array([0, 0, 56]), np.array([255, 255, 154]))
# masks["brown"] = cv2.inRange(img_hsv, np.array([10, 116, 0]), np.array([16, 186, 255]))
# masks["orange"] = cv2.inRange(img_hsv, np.array([10, 147, 0]), np.array([16, 224, 255]))
# masks["purple"] = cv2.inRange(img_hsv, np.array([149, 0, 0]), np.array([161, 255, 255]))
red_mask = cv2.inRange(img_hsv, np.array([175, 0, 0]), np.array([255, 255, 255])) # Красная маска
contours = cv2.findContours(red_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] # Все контуры (список)
for cnt in contours:
epsilon = 0.01 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
corners = len(approx) # Углы фигуры
shape_type = "" # Тип фигуры
moment = cv2.moments(cnt)
if moment['m00'] == 0:
continue
area = cv2.contourArea(cnt) # Площадь фигуры (в пикселях)
x = int(moment['m10'] / moment['m00']) # Центр фигуры
y = int(moment['m01'] / moment['m00']) # Центр фигуры
if corners == 3:
shape_type = "triangle"
if corners == 4:
shape_type = "square"
if corners == 5:
shape_type = "pentagon"
if corners == 6:
shape_type = "hexagon"
if corners == 10:
shape_type = "star"
if corners > 10:
shape_type = "circle"
Last updated