关于opencv读取摄像头的未解之谜

本文记录了使用OpenCV读取USB摄像头时遇到的问题,包括分辨率强制插值、帧率显示为0、内存泄漏以及图像滞后。尝试通过修改源码、设置帧率、手动释放内存等方式解决问题,但仍有内存不足和滞后现象。多线程处理被提为可能的解决方案,以减少内存占用和处理延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    前段时间做项目需要用opencv读usb摄像头的视频数据,遇到很多无解的问题,虽然后来没有用到,但是还是记录下来,也许以后就知道答案了呢。

1、无论摄像头的实际分辨率是多少,opencv读进来的视频分辨率都是640*480大小的,网上说可以用内置的函数修改分辨率的大小,我试了下下面的函数语句,虽然分辨率确实变成了720p,但是清晰度并没有提升甚至有些模糊,看起来像是强行插值扯大的,没有真正得到清晰度720p的图像。

	cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);//不起作用
	cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

     另外,看网上有资料说可以修改opencv的默认值,找到了设置640*480的地方在modules/highgui/src/cap_v4l.cpp,但是修改之后编译并没有什么变化,不知道编译的方式是不是不对。

2、无论摄像头的帧率多少,用opencv内置的函数读到的帧率永远是0.

	double fps = cap.get(CV_CAP_PROP_FPS);//帧率总是得到0

    后来用内置语句对帧率进行设置,没有明显的变化,但是再次输出时,帧率的确是1.也许是显示的原因,设置waitkey=1000ms就可以真正达到一秒一帧。

cap.set(CV_CAP_PROP_FPS, 1);

3、最大的谜团是关于循环读摄像头,最终会内存泄漏这个问题。解决这个问题引申出很多其他问题,比如opencv读摄像头的缓存机制,抓取和显示的延迟,内存的释放等等。

    刚开始没有考虑释放内存,因为觉得Mat图像有自己的释放机制,但是往往只读到7-8万帧程序就崩溃了。实际上,Mat的析构函数只有在程序退出时才会起作用,所以while循环读

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值