Python 由于通道信息,灰色图像上的ROS CvBridge无法工作 我想要什么

Python 由于通道信息,灰色图像上的ROS CvBridge无法工作 我想要什么,python,image,opencv,ros,Python,Image,Opencv,Ros,我希望调整一个灰色图像的大小并发布它,这样我就可以在另一个ROS节点中使用它。然而,我遇到了一个通道信息的问题,即OpenCV或CvBridge 错误 当收听camerawebcam/kinect并将其转换为“mono8”灰色时,您将获得以下信息行、列、通道,其中通道=1。出于某种原因,如果您保存此图像并再次读取,则通道数=3。为什么这很重要?如果在具有3个通道的图像上使用cv2.resizeimage,x,y,则输出图像为x,y,通道=3,但是当只有1个通道时,此信息将丢失,并且输出为x,y。

我希望调整一个灰色图像的大小并发布它,这样我就可以在另一个ROS节点中使用它。然而,我遇到了一个通道信息的问题,即OpenCV或CvBridge

错误 当收听camerawebcam/kinect并将其转换为“mono8”灰色时,您将获得以下信息行、列、通道,其中通道=1。出于某种原因,如果您保存此图像并再次读取,则通道数=3。为什么这很重要?如果在具有3个通道的图像上使用cv2.resizeimage,x,y,则输出图像为x,y,通道=3,但是当只有1个通道时,此信息将丢失,并且输出为x,y。问题是没有频道信息CvBridge无法工作

以下代码有效,因为cv2.resize在3个通道上执行:

#!/usr/bin/env python
PKG = 'something'
import roslib; roslib.load_manifest(PKG)
import rospy
import cv2
import sys
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError

class Test:

    def __init__(self):
        self.image_sub = rospy.Subscriber("/camera/rgb/image_raw",Image, self.callback)
        self.image_sub = rospy.Subscriber("test_image",Image, self.callback2)
        self.image_pub = rospy.Publisher("test_image", Image)
        self.bridge = CvBridge()

    def callback(self, image):
        try:
            cv_image = self.bridge.imgmsg_to_cv2(image, 'mono8')
        except CvBridgeError, e:
            print e
        
        print cv_image.shape ### output: (480, 640, 1)
        cv2.imshow("Test", cv_image)
        cv2.imwrite("Test.png", cv_image)
        cv2.waitKey(3)

        test2 = cv2.imread("Test.png")
        print test2.shape ### output: (480, 640, 3)
        cv2.imshow("Test 2",test2)
        cv2.waitKey(3)
        test2 = cv2.resize(test2,(250,240))
        print test2.shape ### output: (250, 240, 3)
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(test2))

    def callback2(self, image):
        try:
            cv_image = self.bridge.imgmsg_to_cv2(image)
        except CvBridgeError, e:
            print e
        
        cv2.imshow("Test3", cv_image)
        cv2.waitKey(3)

def main(args):
    test = Test()
    rospy.init_node('image_converter', anonymous=True)

    try:
        rospy.spin()
    except KeyboardInterrupt:
        print "Shutting down"
    cv2.destroyAllWindows()


if __name__ == '__main__':
    main(sys.argv)
但是,以下内容在这次尝试发布调整大小时不起作用:

    print cv_image.shape ### output: (480, 640, 1)
    cv2.imshow("Test", cv_image)
    cv2.imwrite("Test.png", cv_image)
    cv2.waitKey(3)
    
    test2 = cv2.resize(test2,(250,240))
    print test2.shape ### output: (250, 240)
    self.image_pub.publish(self.bridge.cv2_to_imgmsg(test2)) ### ERROR

    test2 = cv2.imread("Test.png")
    print test2.shape
    cv2.imshow("Test 2",test2)
    cv2.waitKey(3)
其他错误 将“mono8”更改为“8UC3”会出现以下错误:[yuv422]是一种颜色格式,但[8UC3]不是,因此它们必须具有相同的OpenCV类型,CV_8UC3,CV16UC1

我真正的问题 如何调整灰色图像的大小并在ROS中发布,而不丢失频道信息或以某种方式将其转换为3个频道?我唯一关心的是,我可以发送调整大小的信息,频道的数量对我来说并不重要

信息 Ubuntu 12.04, 罗斯水电公司,
OpenCV 2.4.9

在CvBridge的主分支中,现在已修复了无需频道信息即可发送图像的问题:

对于不在主分支上的人员:

#Ugly gray 3 channel hack for CvBridge (old version)
#Save image
cv2.imwrite(self.dir_image_save+'tempface.png', cv2_image)
#Load
cv2_image = cv2.imread(self.dir_image_save+'tempface.png')

现在,您得到了一个3通道的灰色图像,但很难看。

在您说不起作用的代码中,您是不是没有先阅读就发布了test2?当您发布test2时,它似乎是空的。我应该更清楚地说明我的示例,但这里已经讨论了这个问题: