关于用opencv 设置摄像头读分辨率问题的若干说明
在做一个人脸识别的软件时,被一个问题困扰很久。摄像头读取得图像只能小于480*320,比这个尺寸大就无法读取,但使用摄像头厂家提供的软件就可以读出高分辨率的。前期一直以为是usb2.0导致的带宽不够,但厂家的软件就可以,这就不对了。直到读了这篇博文才发现问题所在,现在可以读取的分辨率可以达到1280*960。
原文地址为:https://blog.csdn.net/kyjl888/article/details/69367912
1 问题最初起因
我想充分利用相机高分辨率来提高视角,故用opencv直接设置摄像机分辨率。不幸的我倒霉出现问题。
VideoCapture类读AVI视频可以设置高分辨率1294*964,读摄像头为啥不能设置1294*964,可以设置640*480,也可以设置320*240
有读摄像头设置分辨率1294*964成功的吗,相机要求视场大,距离目标不能太远,要求稳定。所以就用最高分辨率了。
是我相机问题,还是VideoCapture类问题
2 问题表现形式
2.1 ERROT: SampleCB() - buffer sizes do not match 解决方案
cap.set(CV_CAP_PROP_FRAME_WIDTH,1294);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,964);
摄像头摄取的图片超出了OpenCV的最大限度,造成缓冲区大小不匹配:
解决方法很简单。
cv::VideoCapture capture(1);
double width=capture.get(CV_CAP_PROP_FRAME_WIDTH);
double height=capture.get(CV_CAP_PROP_FRAME_HEIGHT);
capture.set(CV_CAP_PROP_FRAME_WIDTH,width);
capture.set(CV_CAP_PROP_FRAME_HEIGHT,height);
参考 的http://blog.csdn.net/jia_zhengshen/article/details/9980495
2.2 但没有解决,因为默认为VideoCapture 640*480
VideoCapture cap(1);
//double width=cap.get(CV_CAP_PROP_FRAME_WIDTH);
//double height=cap.get(CV_CAP_PROP_FRAME_HEIGHT);
//cap.set(CV_CAP_PROP_FRAME_WIDTH,width);
//cap.set(CV_CAP_PROP_FRAME_HEIGHT,height);
VideoCapture 或basler 相机默认为640*480
VideoCapture capture(1);//默认为640*480,不可设置再大,可以设置再小
//VideoCapture capture("1.avi");//读取视频1294*964--640*480
//capture.set(CV_CAP_PROP_FRAME_WIDTH,1294);//
//capture.set(CV_CAP_PROP_FRAME_HEIGHT,964);
//double width=capture.get(CV_CAP_PROP_FRAME_WIDTH);
//double height=capture.get(CV_CAP_PROP_FRAME_HEIGHT);
//capture.set(CV_CAP_PROP_FRAME_WIDTH,width);
//capture.set(CV_CAP_PROP_FRAME_HEIGHT,height);
2.3 但可以设置再小
2.4 摄像机采集图像时出现了问题图像是条状
一般使用,摄像机自带的软件,打开摄像机,设置摄像机的分辨率是没有问题的。如果你使用其他软件,打开摄像机采集图像时出现了问题。问题就是您读取得图像是条状。
这说明你摄像设置的摄像机分辨率是有问题的。
2.5 自带软件 可以,SDK可以 设置高分辨率1294*964
3 问题说明
设置摄像机分辨率的问题。最小分辨率,宽度为4,高度为3。以此类推应该为4的倍数或3的倍数。你可以通过videocapture成员函数set来设置,摄像机的分辨率。videocapture默认的情况下为640×480。
3.1
opencv 可以 4-3 8-6 16-12 32-24 320-240 640-480 960-720 1280-960
4-2,4-6不可以 1288-966 不可以
1284-963可以
capture.set(CV_CAP_PROP_FRAME_WIDTH,4);////可以显示 但8*6最小
capture.set(CV_CAP_PROP_FRAME_HEIGHT,3);
capture.set(CV_CAP_PROP_FRAME_WIDTH,960);//可以
capture.set(CV_CAP_PROP_FRAME_HEIGHT,720);
capture.set(CV_CAP_PROP_FRAME_WIDTH,1284);//最大
capture.set(CV_CAP_PROP_FRAME_HEIGHT,963);
4 笔记本摄像头禁用方法
参考http://wenda.so.com/q/1460885382721621?src=140
两种方法实现摄像头的禁用:
1、部分品牌和型号的笔记本电脑有禁用摄像头的快捷键,比如THINKPAD E450,该机使用快捷键FN+F7禁用或者启用摄像头,如图:
2、在设备管理器里禁用摄像头,右键点击“计算机”,选择“管理”,在左侧点击“设备管理器”,可以在图像设备下找到摄像头,右键点击,选择禁用即可,如图:
opencv读取百万高清摄像头。先设置摄像头分辨率。
opencv设置USB免驱动摄像头问题 (liunx)
问题来源:
用笔记本接USB 摄像机opencv代码采集视频数据,保存的视频AVI 提示 错误 [无法解码多工传送的流]
保存avi视频问题(与摄像机分辨率有关)--- VideoWriter 问题
-
capture.set(CV_CAP_PROP_FRAME_WIDTH, videoSize.width);
-
capture.set(CV_CAP_PROP_FRAME_HEIGHT, videoSize.height);
-
VideoWriter writer(saveFileName, CV_FOURCC('X','V','I','D'), rate, videoSize,isColor);
1.视频存储为摄像机分辨率的整数倍分
摄像机分辨率为1280*720
视频可以存为-w=1280 -h=720 /-w=640 -h=360-/ -w=320 -h=240-/ ......
视频如果存为-w=1960 -h=1080 /-w=800 -h=600 提示 错误 [无法解码多工传送的流]
在窗口显示没有问题
w=1960 -h=1080 /-w=1280 -h=720
-w=800 -h=600 (不在中心)
图片分辨率 imwrite
图片不在中心问题(图片问题比视频少)
在上诉设置中截图保存,得到的分辨率也不一定为设置的分辨率 摄像机分辨率为1280*720
-w=1960 -h=1080/ -w=1000 -h=720 ======= 1280*720
-w=880 -h=600/880 720=================960*540
-w=600 -h=480/640 720 ===============640*480
-w=600 -h=400 ============640*360
-
capture.set(CV_CAP_PROP_FRAME_WIDTH, videoSize.width);
-
capture.set(CV_CAP_PROP_FRAME_HEIGHT, videoSize.height);
-
imwrite(fname,frame);//imwrite函数与
另一个摄像机1080P 1920 x 1080分辨率
视频
1920 x 1080 1280 x 720 -ok
图片
-w=660 -h=720/ -w=990 -h=550 /-w=880 -h=600 ======800*600
-w=440 -h=550 ======640*480
与硬件摄像机本身分辨率和opencv软件有关.