Python 使用OpenCV和ROS时冻结黑色图像和轨迹栏
我试图创建一个简单的ROS节点,订阅一个图像主题,然后用轨迹栏显示图像,以允许用户确定阈值图像所需的正确HSV值 问题是窗口显示时没有图像。像这样: 无图像窗口的屏幕截图: 一个有趣的行为是将Python 使用OpenCV和ROS时冻结黑色图像和轨迹栏,python,opencv,ros,Python,Opencv,Ros,我试图创建一个简单的ROS节点,订阅一个图像主题,然后用轨迹栏显示图像,以允许用户确定阈值图像所需的正确HSV值 问题是窗口显示时没有图像。像这样: 无图像窗口的屏幕截图: 一个有趣的行为是将cv2.waitKey(30)放在main的rospy.spin()前面。然后我得到一个窗口,有轨迹栏,没有图像,没有任何东西是可点击的。像这样: 功能不可点击且无图像的窗口截图: 我已经读了很多关于这个问题的书,当人们使用cv2.waitKey(delay)时,这个问题似乎得到了解决,但无论我如何处理
cv2.waitKey(30)
放在main
的rospy.spin()前面。然后我得到一个窗口,有轨迹栏,没有图像,没有任何东西是可点击的。像这样:
功能不可点击且无图像的窗口截图:
我已经读了很多关于这个问题的书,当人们使用cv2.waitKey(delay)
时,这个问题似乎得到了解决,但无论我如何处理代码,情况都不是这样
我的系统是Ubuntu GNOME 16.04,它正在运行
#!/usr/bin/env python
"""Allows the user to calibrate for HSV filtering later."""
# Standard libraries
from argparse import ArgumentParser
# ROS libraries
import rospy
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
# Other libraries
import cv2
import numpy as np
def nothing():
"""Does nothing."""
pass
def calibrator(msg, args):
"""Updates the calibration window"""
bridge = args
raw = bridge.imgmsg_to_cv2(msg, desired_encoding="bgr8")
hsv = cv2.cvtColor(raw, cv2.COLOR_BGR2HSV)
# get info from track bar and appy to result
h_low = cv2.getTrackbarPos('H_low', 'HSV Calibrator')
s_low = cv2.getTrackbarPos('S_low', 'HSV Calibrator')
v_low = cv2.getTrackbarPos('V_low', 'HSV Calibrator')
h_high = cv2.getTrackbarPos('H_high', 'HSV Calibrator')
s_high = cv2.getTrackbarPos('S_high', 'HSV Calibrator')
v_high = cv2.getTrackbarPos('V_high', 'HSV Calibrator')
# Normal masking algorithm
lower = np.array([h_low, s_low, v_low])
upper = np.array([h_high, s_high, v_high])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(raw, raw, mask=mask)
cv2.imshow('HSV Calibrator', result)
cv2.waitKey(30)
def main(node, subscriber):
"""Creates a camera calibration node and keeps it running."""
# Initialize node
rospy.init_node(node)
# Initialize CV Bridge
bridge = CvBridge()
# Create a named window to calibrate HSV values in
cv2.namedWindow('HSV Calibrator')
# Creating track bar
cv2.createTrackbar('H_low', 'HSV Calibrator', 0, 179, nothing)
cv2.createTrackbar('S_low', 'HSV Calibrator', 0, 255, nothing)
cv2.createTrackbar('V_low', 'HSV Calibrator', 0, 255, nothing)
cv2.createTrackbar('H_high', 'HSV Calibrator', 50, 179, nothing)
cv2.createTrackbar('S_high', 'HSV Calibrator', 100, 255, nothing)
cv2.createTrackbar('V_high', 'HSV Calibrator', 100, 255, nothing)
# Subscribe to the specified ROS topic and process it continuously
rospy.Subscriber(subscriber, Image, calibrator, callback_args=(bridge))
rospy.spin()
if __name__ == "__main__":
PARSER = ArgumentParser()
PARSER.add_argument("--subscribe", "-s",
default="/cameras/lmy_cam",
help="ROS topic to subcribe to (str)", type=str)
PARSER.add_argument("--node", "-n", default="CameraCalibrator",
help="Node name (str)", type=str)
ARGS = PARSER.parse_args()
main(ARGS.node, ARGS.subscribe)
只有当我们在订阅者的回调函数中使用cv2.imshow(winname,mat)
时,问题才会出现;其他OpenCV函数正常工作,但这似乎是一个bug
克服这一问题的一种方法是像这样分析每个帧:
while not rospy.is_shutdown():
data = rospy.wait_for_message(topic, topic_type)
# do stuff
cv2.imshow(winname, mat)
cv2.waitKey(delay)
与此相反:
def callback(data):
# do stuff
cv2.imshow(winname, mat)
cv2.waitKey(delay)
rospy.subscribe(name, data_class, callback=callback)
rospy.spin()
您缺少while
循环。我有一个使用HSV颜色空间对图像执行阈值的运行代码,但是没有使用ros
ModuleEyes,我已经能够使用OpenCV库来执行此操作,但是图像提要来自ros提要;这是主要的挑战。试着把它放在一段时间内,看起来你是对的。只有在回调语句(通常有效)中使用cv2.imshow(winname,mat)
时,问题才会出现。使用而不是rospy.is_shutdown():
,然后使用rospy.wait_for_message(topic,topic类型)
分析每条消息对我有效。你为什么不把它作为一个答案来写呢?