7 from __future__
import absolute_import
8 from __future__
import division
9 from __future__
import print_function
13 from distutils.version
import LooseVersion
14 from jsk_recognition_msgs.msg
import ClassificationResult
15 from jsk_topic_tools
import ConnectionBasedTransport
16 import message_filters
19 from sensor_msgs.msg
import Image
23 return ((byteval & (1 << idx)) != 0)
27 """Color map (RGB) considering label numbers N.
29 N (``int``): Number of labels.
31 cmap = np.zeros((N, 3),
37 r = np.bitwise_or(r, (
bitget(id, 0) << 7-j))
38 g = np.bitwise_or(g, (
bitget(id, 1) << 7-j))
39 b = np.bitwise_or(b, (
bitget(id, 2) << 7-j))
50 super(self.__class__, self).
__init__()
51 self.
pub = self.advertise(
'~output', Image, queue_size=1)
59 sync.registerCallback(self.
_draw)
65 def _draw(self, cls_msg, imgmsg):
66 bridge = cv_bridge.CvBridge()
67 rgb = bridge.imgmsg_to_cv2(imgmsg, desired_encoding=
'rgb8')
69 n_results = len(cls_msg.labels)
70 for i
in range(n_results):
71 label = cls_msg.labels[i]
72 color = self.
cmap[label % len(self.
cmap)] * 255
73 legend_size = int(rgb.shape[0] * 0.1)
74 rgb[:legend_size, :] = (np.array(color) * 255).astype(np.uint8)
76 label_name = cls_msg.label_names[i]
77 if len(label_name) > 16:
78 label_name = label_name[:10] +
'..' + label_name[-4:]
79 label_proba = cls_msg.label_proba[i]
80 title =
'{0}: {1:.2%}'.format(label_name, label_proba)
81 (text_w, text_h), baseline = cv2.getTextSize(
82 title, cv2.FONT_HERSHEY_PLAIN, 1, 1)
83 scale_h = legend_size / (text_h + baseline)
84 scale_w = rgb.shape[1] / text_w
85 scale = min(scale_h, scale_w)
86 (text_w, text_h), baseline = cv2.getTextSize(
87 label_name, cv2.FONT_HERSHEY_SIMPLEX, scale, 1)
88 if LooseVersion(cv2.__version__).version[0] < 3:
91 line_type = cv2.LINE_AA
92 cv2.putText(rgb, title, (0, text_h - baseline),
93 cv2.FONT_HERSHEY_PLAIN + cv2.FONT_ITALIC,
94 scale, (255, 255, 255), 1,
97 out_msg = bridge.cv2_to_imgmsg(rgb, encoding=
'rgb8')
98 out_msg.header = imgmsg.header
99 self.
pub.publish(out_msg)
102 if __name__ ==
'__main__':
103 rospy.init_node(
'draw_classification_result')