Jetson Xavier NX运行Vins fusion:error: (-215:Assertion failed) s >= 0 in function ‘setSize‘

描述:

采用Jetson Xavier NX跑Vins fusion算法
编译警告信息:warning: libopencv_imgproc.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgproc.so.4.5等,提示冲突。
运行报错:
1、
OpenCV(4.5.4) /home/ubuntu/build_opencv/opencv/modules/core/src/matrix.cpp:250: error: (-215:Assertion failed) s >= 0 in function ‘setSize’
2、what(): OpenCV(4.5.4) /home/ubuntu/build_opencv/opencv/modules/core/src/alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 558470286869760 bytes in function ‘OutOfMemoryError’

原因:

由于cv_bridge与opencv版本冲突导致的:例如本机采用的opencv版本为4.5.4,而采用apt-get install cv_bridge的对应版本为4.2.0.

解决:

卸载原cv_bridge sudo apt-get remove ros-melodic-cv-bridge,下载自己的ros对应版本的cv_bridge并链接到指定的opencv。
参考博客:
1、解决ROS的cv_bridge与自己安装的opencv的版

### 关于 OpenCV 中 `cv::Exception` 错误的分析 在 OpenCV 的核心模块中,`setSize` 函数用于设置矩阵大小。如果参数传递不正确或者内存分配出现问题,则会触发断言失败错误 `(s >= 0)`。以下是针对该问题的具体原因和解决方法: #### 1. **错误的根本原因** 根据提供的引用信息[^1]、[^2] 和 [^3],可以发现以下几点可能的原因: - 参数 `s` 是指代矩阵尺寸的一个变量,在调用 `setSize` 方法时,其值小于零。 - 可能由于输入数据不符合预期格式(例如图像为空或损坏),导致计算得出负数维度。 - 如果程序运行环境存在多个版本的 OpenCV 库文件(如 libopencv_core.so 或 libopencv_imgproc.so),可能会引发库冲突。 #### 2. **解决方案** ##### (1)检查输入数据的有效性 确保传入的数据是有效的,并且满足函数的要求。可以通过以下方式验证: ```cpp if (image.empty()) { std::cerr << "Image is empty!" << std::endl; return -1; } ``` ##### (2)更新依赖项并清理旧版库 当编译环境中同时安装了不同版本的 OpenCV 时,可能导致动态链接库冲突。建议执行以下操作: - 删除多余的 OpenCV 版本及其关联头文件。 - 使用工具如 `ldd` 检查可执行文件的实际加载路径,确认是否存在重复定义的情况。 对于 Jetson Xavier NX 平台上的 ROS 集成项目,需特别注意调整 CMakeLists.txt 文件中的链接顺序以及显式指定所需的特定版本号[^2]。 ##### (3)增加异常捕获机制 为了提高代码健壮性,可以在关键位置加入 try-catch 结构来处理潜在的风险点: ```cpp try { Mat img = imread("test.jpg"); if (!img.data) throw cv::Exception(-1,"Failed to load image."); } catch(const cv::Exception& e){ cerr<<e.what()<<'\n'; } ``` ##### (4)优化资源管理策略 部分情况下,“Out of Memory” 类型的次级错误也可能间接引起当前现象。因此有必要重新评估目标硬件配置是否能够支持既定任务规模;必要时降低分辨率或其他消耗较大的选项设置。 --- ### 示例修复代码片段 下面给出一段修正后的 Python 脚本作为示范用途: ```python import cv2 def safe_imshow(window_name, img): if img is not None and isinstance(img, np.ndarray) and img.size > 0: height, width = img.shape[:2] if height > 0 and width > 0: # Ensure dimensions are positive. cv2.imshow(window_name, img) else: raise ValueError(f"Invalid image dimensions ({height}, {width})") else: raise TypeError("Input must be a valid non-empty NumPy array") # Example usage try: img = cv2.imread('example.png') safe_imshow("Example Image", img) except Exception as ex: print(ex) cv2.waitKey(0) cv2.destroyAllWindows() ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值