C++ 自定义图像格式的奇怪OpenCV问题

C++ 自定义图像格式的奇怪OpenCV问题,c++,opencv,memory,compilation,ros,C++,Opencv,Memory,Compilation,Ros,我的问题是在ROS框架内,但我认为这实际上是一个OpenCV问题 我的公司有一个我们已经使用多年的自定义图像数据类型。在ROS中,我需要将ImageConstPtr对象转换为我们的图像格式。作为起点,我在roswiki上使用了ROS图像传输订阅示例。它构建并运行良好,也就是说,在本例中,当它接收到一个映像时,使用压缩传输提示正确执行回调。但是,如果我在.cpp文件中的任何位置声明公司图像数据类型的变量(我将称之为Rgba),即使我实际上没有在任何地方使用它,我会在回调触发时得到: [ERROR]

我的问题是在ROS框架内,但我认为这实际上是一个OpenCV问题

我的公司有一个我们已经使用多年的自定义图像数据类型。在ROS中,我需要将ImageConstPtr对象转换为我们的图像格式。作为起点,我在roswiki上使用了ROS图像传输订阅示例。它构建并运行良好,也就是说,在本例中,当它接收到一个映像时,使用压缩传输提示正确执行回调。但是,如果我在.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,或者我们的底层图像表示错误地管理了内存。奇怪的是,我一声明变量,行为就发生了。如果我将它声明为指针,它不会发生,但是一旦我编写了一个函数去引用该指针——同样,即使我没有调用该函数——我就会得到这个错误。只要我删除对图像类型的任何引用,问题就消失了


有什么想法吗

我明白了。我们的自定义图像数据类型与OpenCV一样具有libjpeg依赖性。版本不同,因此当声明自定义数据类型的图像时,链接器使用我们的libjpeg版本而不是OpenCV版本,我们得到了原始问题中描述的行为。

可能是因为ROS试图将图像转换为常规格式,即提供给cv_桥的格式。可能吗?你是如何得到ROS图像的?如果没有一些有趣的问题,是无法猜测的。与函数cvtColor中的错误-error:-215 scn==3 | | scn==4相关的实际代码是什么?