opencv 读取图片路径失败,未找到stl.cpp,读取字符串失败,字符路径前被自动加上?

这篇博客分享了在C++中遇到的读取文件路径失败的问题,尝试了多种常规解决方案无效。最终通过两种方法解决了问题:1. 使用`using namespace std`并直接将路径赋值给字符串变量;2. 将路径转换为`const char*`类型传入`imread`函数。这两种方法都成功读取到了图片。

这个问题搞了我一个小时,其他常规的解决方案都试过了,库文件这些配置是正确的,也尝试修改了编码,

还是读取路径失败。调试进入base.cpp发现字符串被自动加上了?,未找到stl.cpp

解决方案1:引入using namespace std

然后把路径放在定义的字符串变量中

imagepath = "C:\\Users\\52505\\Desktop\\1.png"

src = imread(imagepath );

运行成功,读取到图片

解决方案2:

可能是字符串转换的原因,使用const char* path = "C:\\Users\\52505\\Desktop\\1.png",

然后将path传入imread中

亲测可解

 

如有帮组,请点赞

### RK3588平台RTSP摄像头数据读取与推流的C++多线程实现 为了在RK3588平台上高效地读取RTSP网络摄像头的数据并进行推流,可以通过C++多线程技术分离读、推理和写的操作。以下是具体的实现方案: #### 多线程架构设计 采用三线程结构分别负责读取视频帧、执行推理以及推送处理后的视频帧至RTSP服务器。 1. **读取线程** 使用OpenCV库中的`cv::VideoCapture`类来捕获RTSP流中的每一帧图像,并将其存储在一个共享队列中以便后续处理[^1]。为了避免竞争条件,需使用互斥锁保护该队列。 ```cpp void read_video(cv::VideoCapture& cap, std::queue<cv::Mat>& frame_queue, bool& finished, std::mutex& queue_mutex) { while (!finished) { cv::Mat frame; if (cap.read(frame)) { std::lock_guard<std::mutex> lock(queue_mutex); frame_queue.push(frame); // 将帧加入队列 } else { break; // 如果无法继续读取,则退出循环 } } } ``` 2. **推理线程** 推理线程从共享队列中获取待处理的帧,调用目标检测或其他AI模型对其进行分析。如果OCR算法性能较低,可考虑引入异步机制减少阻塞时间[^4]。 ```cpp void process_frame(std::queue<cv::Mat>& frame_queue, std::queue<cv::Mat>& output_queue, bool& finished, std::mutex& queue_mutex) { while (!finished || !frame_queue.empty()) { cv::Mat input_frame; { std::lock_guard<std::mutex> lock(queue_mutex); if (!frame_queue.empty()) { input_frame = frame_queue.front(); frame_queue.pop(); // 取出帧 } else { continue; // 队列为空则跳过本次迭代 } } // 假设此处存在一个目标检测函数 detect_objects() cv::Mat processed_frame = detect_objects(input_frame); { std::lock_guard<std::mutex> lock(queue_mutex); output_queue.push(processed_frame); // 存储处理后的帧 } } } ``` 3. **推流线程** 利用GStreamer构建管道将经过推理处理的帧重新编码并通过RTSP协议发送给客户端设备[^3]。此部分涉及复杂的命令字符串拼接工作,请确保各参数配置无误后再部署实际环境测试。 ```cpp void write_to_rtsp(std::queue<cv::Mat>& output_queue, const std::string& pipeline_str, bool& finished, std::mutex& queue_mutex) { GstElement *pipeline = gst_parse_launch(pipeline_str.c_str(), NULL); gst_element_set_state(pipeline, GST_STATE_PLAYING); while (!finished || !output_queue.empty()) { cv::Mat out_frame; { std::lock_guard<std::mutex> lock(queue_mutex); if (!output_queue.empty()) { out_frame = output_queue.front(); output_queue.pop(); // 获取下一帧用于传输 } else { usleep(10000); // 微秒级休眠等待新数据到来 continue; } } // 转换为适合gstreamer输入格式... // 并通过适当方式传递给GST Pipeline... } gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipeline)); } ``` 以上代码片段展示了如何利用标准模板库(STL)容器配合pthread或者std::thread创建独立运作却相互协作的任务单元;同时强调了同步原语的重要性——即每当访问公共资源时都应采取必要的锁定措施以防冲突发生。 #### 注意事项 - 在开发过程中可能会遇到诸如内存泄漏、死锁等问题,务必做好充分调试准备。 - 对于某些特定硬件加速需求(比如GPU支持),可能还需要额外集成相应SDK或驱动程序才能充分发挥计算潜力。 - 实际应用当中还需考虑到网络带宽限制等因素影响最终用户体验质量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猪猪派对

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

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

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

打赏作者

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

抵扣说明:

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

余额充值