1 from distutils.version
import LooseVersion
5 from threading
import Lock, Thread
10 import python_qt_binding
11 from python_qt_binding.QtCore
import pyqtSignal
12 from python_qt_binding.QtCore
import pyqtSlot
13 from python_qt_binding.QtCore
import QEvent
14 from python_qt_binding.QtCore
import QSize
15 from python_qt_binding.QtCore
import Qt
16 import python_qt_binding.QtCore
as QtCore
17 from python_qt_binding.QtCore
import QTimer
18 from python_qt_binding.QtCore
import qWarning
19 from python_qt_binding.QtCore
import Slot
20 from python_qt_binding.QtGui
import QBrush
21 from python_qt_binding.QtGui
import QColor
22 from python_qt_binding.QtGui
import QFont
23 from python_qt_binding.QtGui
import QIcon
24 from python_qt_binding.QtGui
import QImage
25 from python_qt_binding.QtGui
import QPainter
26 from python_qt_binding.QtGui
import QPen
27 from python_qt_binding.QtGui
import QPixmap
28 from python_qt_binding.QtGui
import qRgb
29 import python_qt_binding.QtGui
as QtGui
32 from cv_bridge
import CvBridge
33 from cv_bridge
import CvBridgeError
34 from image_view2.msg
import MouseEvent
35 from resource_retriever
import get_filename
38 from sensor_msgs.msg
import Image
39 from std_msgs.msg
import Bool
40 from std_msgs.msg
import Time
42 if LooseVersion(python_qt_binding.QT_BINDING_VERSION).version[0] >= 5:
43 from python_qt_binding.QtWidgets
import QAction
44 from python_qt_binding.QtWidgets
import QComboBox
45 from python_qt_binding.QtWidgets
import QDialog
46 from python_qt_binding.QtWidgets
import QMenu
47 from python_qt_binding.QtWidgets
import QMessageBox
48 from python_qt_binding.QtWidgets
import QLabel
49 from python_qt_binding.QtWidgets
import QPushButton
50 from python_qt_binding.QtWidgets
import QSizePolicy
51 from python_qt_binding.QtWidgets
import QVBoxLayout
52 from python_qt_binding.QtWidgets
import QWidget
55 from python_qt_binding.QtGui
import QAction
56 from python_qt_binding.QtGui
import QComboBox
57 from python_qt_binding.QtGui
import QDialog
58 from python_qt_binding.QtGui
import QMenu
59 from python_qt_binding.QtGui
import QMessageBox
60 from python_qt_binding.QtGui
import QLabel
61 from python_qt_binding.QtGui
import QPushButton
62 from python_qt_binding.QtGui
import QSizePolicy
63 from python_qt_binding.QtGui
import QVBoxLayout
64 from python_qt_binding.QtGui
import QWidget
69 super(ComboBoxDialog, self).
__init__()
71 vbox = QVBoxLayout(self)
75 button = QPushButton()
76 button.setText(
"Done")
78 vbox.addWidget(button)
90 rqt wrapper for image_view2 93 super(ImageView2Plugin, self).
__init__(context)
94 self.setObjectName(
"ImageView2Plugin")
96 context.add_widget(self.
_widget)
99 self._widget.save_settings(plugin_settings, instance_settings)
102 self._widget.restore_settings(plugin_settings, instance_settings)
105 self._widget.trigger_configuration()
110 QLabel.__init__(self)
114 self.setPixmap(self._pixmap.scaled(
115 self.width(), self.height(),
116 QtCore.Qt.KeepAspectRatio))
121 Qt widget to communicate with image_view2 125 repaint_trigger = pyqtSignal()
128 super(ImageView2Widget, self).
__init__()
131 self.repaint_trigger.connect(self.
redraw)
138 self.label.setAlignment(Qt.AlignCenter)
139 self.label.setSizePolicy(
140 QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))
142 vbox = QVBoxLayout(self)
143 vbox.addWidget(self.
label)
148 self._update_topic_thread.start()
151 self.setMouseTracking(
True)
152 self.label.setMouseTracking(
True)
162 self.image_sub.unregister()
163 rospy.loginfo(
"Subscribing %s" % (topic +
"/marked"))
164 self.
image_sub = rospy.Subscriber(topic +
"/marked",
168 topic +
"/event", MouseEvent, queue_size=1)
176 if msg.width == 0
or msg.height == 0:
177 rospy.logdebug(
"Looks input images is invalid")
179 cv_image = self.bridge.imgmsg_to_cv2(msg, msg.encoding)
180 if msg.encoding ==
"bgr8":
181 self.
cv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB)
182 elif msg.encoding ==
"rgb8":
186 self.repaint_trigger.emit()
189 need_to_update =
False 190 for (topic, topic_type)
in rospy.get_published_topics():
191 if topic_type ==
"sensor_msgs/Image":
194 self._image_topics.append(topic)
195 need_to_update =
True 199 self._dialog.combo_box.clear()
201 self._dialog.combo_box.addItem(topic)
203 self._dialog.combo_box.setCurrentIndex(
212 if np.all(self.
cv_image)
is not None:
213 size = self.cv_image.shape
214 img = QImage(self.cv_image.data,
215 size[1], size[0], size[2] * size[1],
216 QImage.Format_RGB888)
218 self.
pixmap = QPixmap(size[1], size[0])
219 self.pixmap.convertFromImage(img)
220 self.label.setPixmap(self.pixmap.scaled(
221 self.label.width(), self.label.height(),
222 QtCore.Qt.KeepAspectRatio))
226 label_x = self.label.x()
227 label_y = self.label.y()
228 label_width = self.label.width()
229 label_height = self.label.height()
230 pixmap_width = self.label.pixmap().width()
231 pixmap_height = self.label.pixmap().height()
232 x_offset = (label_width - pixmap_width) / 2.0 + label_x
233 y_offset = (label_height - pixmap_height) / 2.0 + label_y
234 return (e.x() - x_offset, e.y() - y_offset)
238 msg.header.stamp = rospy.Time.now()
239 msg.type = MouseEvent.MOUSE_MOVE
241 msg.width = self.label.pixmap().width()
242 msg.height = self.label.pixmap().height()
244 self.event_pub.publish(msg)
248 msg.header.stamp = rospy.Time.now()
249 if e.button() == Qt.LeftButton:
250 msg.type = MouseEvent.MOUSE_LEFT_DOWN
252 elif e.button() == Qt.RightButton:
253 msg.type = MouseEvent.MOUSE_RIGHT_DOWN
254 msg.width = self.label.pixmap().width()
255 msg.height = self.label.pixmap().height()
258 self.event_pub.publish(msg)
261 if e.button() == Qt.LeftButton:
264 msg.header.stamp = rospy.Time.now()
265 msg.width = self.label.pixmap().width()
266 msg.height = self.label.pixmap().height()
267 msg.type = MouseEvent.MOUSE_LEFT_UP
270 self.event_pub.publish(msg)
274 instance_settings.set_value(
"active_topic", self.
_active_topic)
277 if instance_settings.value(
"active_topic"):
278 topic = instance_settings.value(
"active_topic")
279 self._dialog.combo_box.addItem(topic)
def __init__(self, parent=None)
def onActivated(self, number)
def trigger_configuration(self)
def __init__(self, args, kwargs)
def restore_settings(self, plugin_settings, instance_settings)
def save_settings(self, plugin_settings, instance_settings)
def buttonCallback(self, event)
def resizeEvent(self, event)
def __init__(self, context)