【问题标题】:Frozen black image and trackbar while using OpenCV and ROS使用 OpenCV 和 ROS 时冻结的黑色图像和轨迹栏
【发布时间】:2018-07-11 14:53:03
【问题描述】:

我正在尝试创建一个简单的 ROS 节点来订阅图像主题,然后使用轨迹栏显示图像,以允许用户确定阈值图像所需的正确 HSV 值。

问题是窗口出现时没有图像。像这样:

没有图像的窗口截图:

一个有趣的行为是将cv2.waitKey(30) 放在main 中,就在rospy.spin() 之前。然后我得到了带有轨迹栏的窗口,没有图像,没有任何东西是可点击的。像这样:

具有不可点击功能且无图像的窗口截图:

我已经阅读了很多关于这个问题的信息,当人们使用 cv2.waitKey(delay) 时,它似乎得到了解决,但无论我如何修改代码,这对我来说都不是这样。

我的系统是 Ubuntu GNOME 16.04,它正在运行 ROS Kinetic。

#!/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)

【问题讨论】:

  • 您缺少while 循环。我有一个运行代码,用于使用 HSV 颜色空间对图像执行阈值,但不使用 ros 模块
  • 是的,我只使用 OpenCV 库就可以做到这一点,但是图像源来自 ROS 源;这是主要挑战。
  • 试着把它放在一个while循环中
  • 看来你是对的。仅当我们在回调语句中使用cv2.imshow(winname, mat) 时才会出现此问题(通常有效)。使用while not rospy.is_shutdown():,然后使用rospy.wait_for_message(topic, topic_type) 分析每条消息对我有用。
  • 你为什么不把它写成答案?

标签: python opencv ros


【解决方案1】:

仅当我们在订阅者的回调函数中使用cv2.imshow(winname, mat) 时才会出现此问题;其他 OpenCV 功能正常工作,但这似乎是一个错误。

解决这个问题的一种方法是像这样分析每一帧:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2017-06-30
    • 1970-01-01
    • 2015-09-28
    • 2022-01-05
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多