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



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

我的公司有一种我们已经使用多年的自定义图像数据类型。在ROS中,我需要将ImageConstPtr对象转换为我们的图像格式。作为起点,我在ROS wiki上使用了ROS图像传输订阅示例。它构建和运行良好,即当它接收到图像时(在这种情况下,使用压缩的传输提示),回调会正确执行。然而,如果我在.cpp文件中的任何地方声明一个我公司的image数据类型的变量(我将称之为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

奇怪的是,我认为只有当我订阅了压缩传输主题时才会发生这种情况,尽管我需要重新验证,而且我没有一个包含原始或理论数据的包。

编辑:此代码工作正常(即,输出重复打印"回调成功!"):

#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版本,我们得到了原始问题中描述的行为。

最新更新