DeepSORT C++版的一个bug

博客详细分析了DeepSORT C++实现中因EigenBlock非法索引访问导致的崩溃问题,指出错误源于代码块的不当赋值。作者提供了解决方案,修正了取样特征矩阵的错误索引,确保程序稳定运行。

DeepSORT的官方python版实现是https://github.com/nwojke/deep_sort,C++版的DeepSORT中https://github.com/shaoshengsong/DeepSORT这个版本实现较早(这个版本又似乎是在GitHub - bitzy/DeepSort: c++ version of https://github.com/nwojke/deep_sort.这个版本上稍稍修改了下,yolov2改为yolov3),github上可以看到不少人的DeepSORT都是在这个版本上做的集成和修改,绝大部分代码是照抄的,只是使用的目标检测模型或特征抽取模型不一样而已,或者对DeepSORT代码入口加了个封装类DeepSort,将特征抽取模型部分弄成支持TensorRT的onnx解析方式或者直接读取解析onnx后生成的engine文件(例如:GitHub - GesilaA/deepsort_tensorrt: This is a TensorRT based deepsort project  GitHub - mellivoraPKU/yolov5_trt_deepsort   https://github.com/RichardoMrMu/yolov5-deepsort-tensorrt),因此把这个版本里的Bug也就都带过去了,凡是基于bitzy/DeepSort或者shaoshengsong/DeepSORT这个序列的版本都存在这个问题。

跑这个C++版本以及其他基于这版的DeepSORT时,长时间跑肯定会因为Eigen Block的非法索引访问而发生崩溃,只是这个错误不会经常出现,具体的错误类似如下:

#2  0x0000007f92976b84 in __assert_fail_base (fmt=0x7f92a71c10 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x7f306fc110 "startRow >= 0 && blockRows >= 0 && startRow <= xpr.rows() - blockRows && startCol >= 0 && blockCols >= 0 && startCol <= xpr.cols() - blockCols", file=file@entry=0x7f306fbfb8 "/usr/include/eigen3/Eigen/src/Core/Block.h", line=line@entry=147, function=function@entry=0x7f306fd908 <Eigen::Block<Eigen::M

<think>我们正在解决用户关于OpenCV的`cv::VideoCapture`无法打开指定视频文件的问题。根据用户描述,文件路径为`./Deep_rknn/data/M0201.mp4`。 可能的原因及解决方案如下: 1. **路径问题**:确保文件路径正确。相对路径`./`表示当前工作目录,但程序运行时的工作目录可能与预期不同。 - 建议使用绝对路径来避免歧义。 - 检查文件是否存在于指定路径。可以使用文件系统操作验证文件是否存在。 - 注意:路径中的大小写和特殊字符(如空格)也可能导致问题。 2. **文件权限问题**:确保程序有权限读取该文件。 3. **文件损坏**:确认视频文件是否完整且可播放。尝试用其他播放器打开。 4. **OpenCV支持问题**:OpenCV可能不支持该视频的编解码格式。虽然MP4通常被支持,但具体取决于编译时包含的编解码器。 - 可以尝试安装OpenCV的完整(包含FFmpeg支持)或重新编译OpenCV并启用FFmpeg。 5. **OpenCV本问题**:某些本可能存在bug,更新OpenCV本或回退到稳定本。 6. **代码检查**: - 确保正确使用`cv::VideoCapture`,并检查其返回状态。 - 示例代码: ```cpp cv::VideoCapture cap("./Deep_rknn/data/M0201.mp4"); if (!cap.isOpened()) { std::cerr << "Error opening video file\n"; // 进一步诊断 } ``` 7. **其他**:如果文件路径包含非ASCII字符,可能会引起问题,尽量使用纯ASCII字符路径。 根据上述分析,我们给出以下步骤: **步骤1:检查文件路径** 使用绝对路径并确认文件存在。例如,在Linux下可以使用`realpath`获取绝对路径,或者使用脚本打印当前工作目录。 **步骤2:检查文件是否存在且可读** 在代码中添加检查文件是否存在的代码,或者直接在终端中检查。 **步骤3:检查OpenCV视频支持** 尝试读取其他视频文件,确认OpenCV视频功能是否正常。 **步骤4:尝试使用其他编解码器** 如果可能,将视频转换为另一种格式(如AVI)再试。 **步骤5:代码诊断** 在代码中捕获错误信息,OpenCV有时会提供更具体的错误原因。 示例代码(C++): ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { VideoCapture cap("/absolute/path/to/Deep_rknn/data/M0201.mp4"); if (!cap.isOpened()) { cerr << "无法打开视频文件,请检查路径或文件格式支持。" << endl; // 可以尝试获取更多错误信息 return -1; } // ... 其他处理 return 0; } ``` **步骤6:考虑使用其他库(如FFmpeg)** 如果OpenCV确实无法打开,可以考虑直接使用FFmpeg库读取视频。 注意:用户提供的引用内容(如HOG、SLAM、DeepSORT等)与当前问题关联不大,因此我们主要针对问题本身进行解答。 相关问题: 1. 如何获取OpenCV支持的视频编解码器列表? 2. 如何检查OpenCV是否编译了FFmpeg支持? 3. 在OpenCV中,除了`isOpened()`,还有哪些方法可以诊断视频捕获错误? </think>### `cv::VideoCapture`无法打开视频文件的解决方案 当`cv::VideoCapture`无法打开`./Deep_rknn/data/M0201.mp4`文件时,可以通过以下步骤排查和解决: --- #### 1. **验证文件路径与存在性** ```cpp #include <iostream> #include <opencv2/opencv.hpp> int main() { std::string path = "./Deep_rknn/data/M0201.mp4"; cv::VideoCapture cap(path); if (!cap.isOpened()) { std::cerr << "错误: 文件不存在或路径错误: " << path << std::endl; // 检查文件是否存在 std::ifstream file(path); if (!file.good()) { std::cerr << "文件不存在,请检查路径!" << std::endl; } return -1; } return 0; } ``` - **问题**:相对路径`./`依赖于程序的工作目录,可能与预期不符。 - **解决**: - 使用**绝对路径**(如`/home/user/Deep_rknn/data/M0201.mp4`)。 - 通过`std::filesystem::current_path()`打印当前工作目录并调整路径。 --- #### 2. **检查OpenCV编解码器支持** - **问题**:OpenCV可能未编译对应视频格式的编解码器(如MP4的H.264支持)。 - **验证**: ```bash # 终端检查OpenCV支持 python -c "import cv2; print(cv2.getBuildInformation())" | grep -i "video" ``` - **解决**: 1. 安装FFmpeg:`sudo apt install ffmpeg`(Linux)或下载[FFmpeg官方构建](https://ffmpeg.org/)(Windows)。 2. 重新编译OpenCV并启用FFmpeg: ```bash cmake -D WITH_FFMPEG=ON -D BUILD_opencv_videoio=ON .. ``` --- #### 3. **文件权限与格式问题** - **权限问题**: - Linux:`chmod +r ./Deep_rknn/data/M0201.mp4` - Windows:右键文件 → 属性 → 取消只读属性。 - **文件损坏**: - 用VLC等播放器测试能否打开文件。 - 尝试其他视频文件验证OpenCV功能。 --- #### 4. **OpenCV本与依赖库** - **问题**:旧OpenCV可能存在视频模块的Bug。 - **解决**: - 升级OpenCV至最新(≥4.5.0)。 - 安装必备依赖: ```bash sudo apt install libavcodec-dev libavformat-dev libswscale-dev # Linux ``` --- #### 5. **跨平台路径分隔符** - **问题**:Windows路径分隔符为`\`,Linux/macOS为`/`。 - **解决**:使用跨平台路径处理: ```cpp #include <filesystem> std::string path = std::filesystem::path("./Deep_rknn/data/M0201.mp4").lexically_normal().string(); ``` --- #### 6. **硬件加速冲突** - **问题**:视频文件可能包含特殊编码硬件指令。 - **解决**:禁用硬件加速: ```cpp cv::VideoCapture cap; cap.open(path, cv::CAP_ANY); // 强制使用默认后端 ``` --- ### 总结步骤 1. **优先验证绝对路径** → 排除工作目录问题。 2. **检查文件是否存在且可读** → 权限与损坏问题。 3. **升级OpenCV并启用FFmpeg** → 编解码器支持。 4. **禁用硬件加速兜底** → 解决硬件兼容性。 > **提示**:若问题仍然存在,使用`cap.get(cv::CAP_PROP_BACKEND_NAME)`查看视频后端,并在[OpenCV Issues](https://github.com/opencv/opencv/issues)搜索类似错误。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值