python-2.7 - 在 python (ROS Kinetic) 中通过 OpenCV 访问图像
问题描述
我想在 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
- 罗斯动力学
- 打开简历 3.3.1
解决方案
你已经回答了你自己的问题,图像是压缩的。因此,您的订阅者也是错误的,压缩图像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
.
如果要rosrun
在终端中使用:rosrun 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()
推荐阅读
- javascript - 如何使用 window.open() 限制在 Javascript 中打开的选项卡数量
- css - 通过首选项或应用设置属性启用暗模式
- ajax - 当我尝试从不同的服务器 IIS 执行 Web 方法时出现 500 内部服务器错误
- angular - 卡组中的卡未正确对齐
- javascript - 我可以使用 JavaScript 切换暗模式吗?
- java - GET http://localhost:8080/resources/css/index.css net::ERR_ABORTED 404
- count - 从多个文件中提取模式并以文件名保存
- c++ - 包含 `std::unique_ptr` 是否会使默认复制构造函数成为已删除的函数?
- c# - UWP FullTrustProcess - 实际控制进程
- excel - 条件格式 满足 2 个条件