【问题标题】:Access Image via OpenCV in python (ROS Kinetic)在 python (ROS Kinetic) 中通过 OpenCV 访问图像
【发布时间】:2021-12-11 12:49:23
【问题描述】:

我想在 ros kinetic 中使用 OpenCV 访问我的相机, 这是我的代码

#!/usr/bin/env python2.7
import rospy
from sensor_msgs.msg import Image
import cv2
from cv_bridge import CvBridge, CvBridgeError

rospy.init_node('opencv_example', anonymous=True)
bridge = CvBridge()

def show_image(img):
    cv2.imshow("Image Window", img)
    cv2.waitKey(3)


def image_callback(img_msg):
    try:
        cv_image = bridge.imgmsg_to_cv2(img_msg, "passthrough")
    except CvBridgeError, e:
        rospy.logerr("CvBridge Error: {0}".format(e))
    
    show_image(cv_image)
    
sub_image = rospy.Subscriber("/raspicam_node/image/compressed", Image, image_callback)
cv2.namedWindow("Image Window", 1)

while not rospy.is_shutdown():
      rospy.spin()

这段代码后我得到的只是一个空白图像窗口

在你问主题地址之前,我可以用这个命令rostrum image_view image_view image:=/raspicam_node/image/ _image_transport:=compressed 访问相机

目前,我正在与

  • Ubuntu 16.04
  • 罗斯动力学
  • 打开 CV 3.3.1

【问题讨论】:

  • 我不使用 ROS,但我想有几种可能性......图像永远不会到达,或者它确实到达并且它是空的,或者你没有正确显示它。我会添加一些调试语句,如import numpy as npprint np.mean(cv_image),如果打印出来,则图像已到达,如果为零,则图像为空,如果非零,则显示有问题。跨度>
  • @MarkSetchell 我使用 ROS,你基本上就在那里。 ROS 具有特定类型的压缩图像,并且 OP 正在使用它。它什么也没有显示,因为他们试图在 OpenCV 中将其用作普通的非压缩图像。

标签: python-2.7 opencv ros


【解决方案1】:

您已经回答了自己的问题,图片是压缩的。因此,您的订阅者也是错误的,Compressed Images 有一个特定的 sensor_msgs 类型。

使用numpy,您可以直接在订阅者中解码图像,如下所示:

def image_callback(img_msg):
    np_arr = np.fromstring(img_msg.data, np.uint8)
    image_np = cv2.imdecode(np_arr, cv2.CV_LOAD_IMAGE_COLOR)
    
    show_image(cv_image)

如前所述,您的订阅者也需要看起来像

sub_image = rospy.Subscriber("/raspicam_node/image/compressed", CompressedImage, image_callback)

你需要包含from sensor_msgs.msg import CompressedImage

编辑:

根据您的评论,您还可以将压缩图像重新发布为未压缩图像,以便使用 image_transport 与您的原始代码一起使用。

如果你想在终端中使用rosrunrosrun image_transport republish compressed in:=/raspicam_node/image/compressed raw out:=/raspicam_node/image/uncompressed

或者,如果您使用的是启动文件:

<node name="republish" type="republish" pkg="image_transport" output="screen" args="compressed in:=/raspicam_node/image/compressed raw out:=/raspicam_node/image/uncompressed" />

那你需要把你原来的代码改成

#!/usr/bin/env python2.7
import rospy
from sensor_msgs.msg import Image
import cv2
from cv_bridge import CvBridge, CvBridgeError

rospy.init_node('opencv_example', anonymous=True)
bridge = CvBridge()

def show_image(img):
    cv2.imshow("Image Window", img)
    cv2.waitKey(3)


def image_callback(img_msg):
    try:
        cv_image = bridge.imgmsg_to_cv2(img_msg, "passthrough")
    except CvBridgeError, e:
        rospy.logerr("CvBridge Error: {0}".format(e))
    
    show_image(cv_image)
    
sub_image = rospy.Subscriber("/raspicam_node/image/uncompressed", Image, image_callback)
cv2.namedWindow("Image Window", 1)

while not rospy.is_shutdown():
      rospy.spin()

【讨论】:

  • 生病尝试那个东西并在这个tutorial 中带有这条消息'CompressedImage' object has no attribute 'encoding' 他们说,#我们不使用 cv_bridge 它不支持 python 中的 CompressedImage,抱歉问了很多问题
  • @Anto 我已根据您的评论编辑了我的答案。请看看这是否适合你。
  • 我使用 rosrun,rosrun image_transport republish compressed in:=/raspicam_node/image/ _image_transport:=compressed raw out:=/raspicam_node/image/uncompressed 我必须使用这个命令,如果我只输入 /raspicam_node/image/compressed 总是会出现更改命令的警告。我必须在另一个终端中运行 .py 文件吗?还是与之前的 rosrun 命令相同的终端?我更改了代码,但同样的事情发生了,只是一个黑色的窗口图像
  • 顺便说一下,我使用的是 opencv 3.3.1-dev。知道这是运行此代码的错误版本的 opencv 吗?
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多