You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV库版本冲突致imshow段错误?排查与解决求助

问题:读取ROS Bag并显示图像时出现段错误

我用C++写了个程序,读取ROS Bag文件里的图像,原图像是YUV422格式,转成BGRA后导出正常,但改用cv::imshow显示时触发段错误。

代码片段

// Iterate through each message on the topic
for (const rosbag::MessageInstance& msg : view)
{
  // Extract the image message
  sensor_msgs::Image::ConstPtr image_msg = msg.instantiate<sensor_msgs::Image>();

  if (image_msg != nullptr)
  {
    // Convert the image message to an OpenCV Mat object
    cv_bridge::CvImagePtr cv_ptr;
    try
    {
      cv_ptr = cv_bridge::toCvCopy(image_msg, sensor_msgs::image_encodings::BGR8);
      cv::cvtColor(cv_ptr->image, cv_ptr->image, cv::COLOR_YUV2BGR_YUY2);
    }
    catch (cv_bridge::Exception& e)
    {
      ROS_ERROR("cv_bridge exception: %s", e.what());
      continue;
    }

    // Display the frame
    cv::imshow("Video", cv_ptr->image);

    // Wait for a key press
    if (cv::waitKey(1) == 27) // Esc key
      break;
   }
}

GDB回溯信息

#0  0x00007ffff7a176f4 in cv::_InputArray::kind() const () at /lib/x86_64-linux-gnu/libopencv_core.so.4.2
#1  0x00007ffff7a179bc in cv::_InputArray::size(int) const () at /lib/x86_64-linux-gnu/libopencv_core.so.4.2
#2  0x00007ffff7fa65a3 in cv::imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&) () at /usr/local/lib/libopencv_highgui.so.406

我怀疑是libopencv_highgui和其他OpenCV库版本冲突导致的(段错误发生在cv::imshow调用处),这个判断对吗?有没有解决办法?


回答

你的怀疑完全正确,从GDB回溯能直接看出版本冲突问题:libopencv_core是系统路径下的4.2版本,但libopencv_highgui是/usr/local下的4.6版本。不同版本的OpenCV库内存结构、函数实现不兼容,混合调用必然触发段错误。

解决方法如下:

  • 统一OpenCV版本

    • 若想用系统自带的4.2版本:卸载/usr/local下的4.6版OpenCV,重新编译ROS程序,确保链接到系统库。
    • 若想保留4.6版本:
      1. 编译前设置环境变量,让系统优先加载高版本库:export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
      2. 修改项目的CMakeLists.txt,指定OpenCV查找路径:
        find_package(OpenCV 4.6 REQUIRED PATHS /usr/local/lib/cmake/opencv4/)
        
      3. 重新执行catkin_make/catkin build
  • 同步cv_bridge版本
    cv_bridge是ROS与OpenCV的桥接层,必须和你用的OpenCV版本匹配。重装OpenCV后,需要重新编译cv_bridge:

    cd ~/catkin_ws/src
    git clone https://github.com/ros-perception/vision_opencv.git
    cd vision_opencv
    git checkout melodic  # 替换为你的ROS对应分支
    cd ~/catkin_ws
    catkin_make --cmake-args -DOpenCV_DIR=/usr/local/lib/cmake/opencv4/
    
  • 修复代码中的格式转换逻辑
    你的代码里存在格式转换错误:直接把YUV422格式的图像用cv_bridge::toCvCopy转成BGR8,这一步本身就会导致图像数据异常,可能加重版本冲突的影响。正确写法应该是先按原格式读取,再转成BGR:

    try
    {
      // 先按原图像格式(YUV422_YUY2)读取
      cv_ptr = cv_bridge::toCvCopy(image_msg, sensor_msgs::image_encodings::YUV422_YUY2);
      // 再转换为BGR8格式
      cv::cvtColor(cv_ptr->image, cv_ptr->image, cv::COLOR_YUV2BGR_YUY2);
    }
    catch (cv_bridge::Exception& e)
    {
      ROS_ERROR("cv_bridge exception: %s", e.what());
      continue;
    }
    

内容的提问来源于stack exchange,提问作者wiswasi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:47:52