【问题标题】:Strange OpenCV issue with custom image format自定义图像格式的奇怪 OpenCV 问题
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多