【发布时间】:2013-12-16 13:17:43
【问题描述】:
我的问题在 ROS 框架内,但我认为这实际上是 OpenCV 问题。
我的公司有一种我们已经使用多年的自定义图像数据类型。在 ROS 中,我需要将 ImageConstPtr 对象转换为我们的图像格式。作为起点,我使用了 ROS wiki 上的 ROS 图像传输订阅示例。它构建并运行良好,即回调在接收到图像时正确执行(在这种情况下,使用 compressed 传输提示)。但是,如果我在 .cpp 文件的任何位置声明我公司的图像数据类型的变量(我将其称为 Rgba)——即使我实际上并没有在任何地方使用它——当回调触发时我会得到这个:
[ERROR] [1387198570.300577803, 1386861997.933284812]: /tmp/buildd/ros-groovyopencv2-2.4.6-1precise-20131020-2316/modules/imgproc/src/color.cpp:3346: error: (-215) scn == 3 || scn == 4 in function cvtColor
奇怪的是,我认为这只会在我订阅压缩传输主题时发生,尽管我需要重新验证并且我没有包含原始数据或 theora 数据的包。
编辑:此代码工作正常(即,输出是“回调成功!”的重复打印输出):
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <cv_bridge/cv_bridge.h>
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
ROS_WARN_STREAM("Callback succeeded!");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_listener");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
ros::spin();
}
这段代码给出了上面的错误:
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <cv_bridge/cv_bridge.h>
#include <custom_image.h>
custom_image img_; // This line causes the error displayed above. The callback never fires.
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
ROS_WARN_STREAM("Callback succeeded!");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "image_listener");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
ros::spin();
}
会发生什么?我的第一个想法是我们有一些同名的类或结构干扰 OpenCV,或者我们的底层图像表示不正确地管理内存。奇怪的是,一旦我声明了变量,就会发生这种行为。如果我将它声明为一个指针,它就不会发生,但是一旦我编写了一个取消引用该指针的函数 - 再次,即使我不调用该函数 - 我得到这个错误.只要我删除对我们图像类型的任何引用,问题就会消失。
有什么想法吗?
【问题讨论】:
-
可能是因为 ROS 试图将图像转换为通常的格式,即提供给 cv_bridge 的格式。是否可以?如何获取 ROS 镜像?
-
没有一些代码是不可能猜到的
-
有趣的问题。与错误相关的实际代码是什么 - “error: (-215) scn == 3 || scn == 4 in function cvtColor”?
标签: c++ opencv memory compilation ros