• 关于OpenCV打开摄像头默认分辨率是640*480的问题


    在使用OpenCV打开2k USB摄像头时,发现VideoCapture实例化的对象捕捉的视频帧的分辨率总是 640 × 480 640 \times 480 640×480,而我的摄像头硬件分辨率最高可以支持 2560 × 1440 2560 \times 1440 2560×1440,经研究发现需要重新设置分辨率。

    使用OpenCV测试摄像头支持的最高分辨率

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
    	cv::Mat frame;
    	cv::VideoCapture cap(0);
    
    	//默认分辨率
    	double frame_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    	double frame_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    	double frame_rate = cap.get(cv::CAP_PROP_FPS);
    
    	cout << "default : " << "( " << frame_width << ", " << frame_height << " )" << ", " << frame_rate << endl;
    
    	//设置分辨率,编码格式
    	cap.set(cv::CAP_PROP_FRAME_WIDTH, 5000);
    	cap.set(cv::CAP_PROP_FRAME_HEIGHT, 5000);
    	cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
    
    	double frame_set_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    	double frame_set_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); 
    	double frame_set_rate = cap.get(cv::CAP_PROP_FPS);
    
    	cout << "after Change : " << "( " << frame_set_width << ", " << frame_set_height << " )" << ", " << frame_set_rate << endl;
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    default : ( 640, 480 ), 30
    after Change : ( 2560, 1440 ), 30
    [ WARN:0] terminating async callback
    
    • 1
    • 2
    • 3

    可以看到,欲设置分辨率 5000 × 5000 5000\times5000 5000×5000,但是设置结束后,显示的分辨率为: 2560 × 1440 2560 \times 1440 2560×1440。因此, 2560 × 1440 2560 \times 1440 2560×1440就是该摄像头所支持的最高分辨率。

    更改分辨率

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
    	cv::Mat frame;
    	cv::VideoCapture cap(0);
    
    	//默认分辨率
    	double frame_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    	double frame_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
    	double frame_rate = cap.get(cv::CAP_PROP_FPS);
    
    	cout << "default : " << "( " << frame_width << ", " << frame_height << " )" << ", " << frame_rate << endl;
    
    	//设置分辨率,编码格式
    	cap.set(cv::CAP_PROP_FRAME_WIDTH, 1920);
    	cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1080);
    	cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
    
    	double frame_set_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    	double frame_set_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT); 
    	double frame_set_rate = cap.get(cv::CAP_PROP_FPS);
    
    	cout << "after Change : " << "( " << frame_set_width << ", " << " )" << frame_set_height << ", " << frame_set_rate << endl;
    
    	if (!cap.isOpened())
    	{
    		return -1;
    	}
    	cout << "摄像头是否打开:" << cap.isOpened() << endl;
    
    	while (1) {
    		cap.read(frame);
    
    		cv::imwrite("./1920-1080-4.jpg", frame);
    		cv::namedWindow("frame", 0);
    		cv::resizeWindow("frame", 1280, 720);		//设置长宽大小
    		cv::moveWindow("frame", 0, 0);              //移动窗口到(0,0)坐标
    		cv::imshow("frame", frame);
    		cv::waitKey(1);								//间隔时间长一点,保存完整图片
    	}
    	cap.release();
    	cv::destroyAllWindows();
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    如此,捕获的视频帧分辨率可高达 1920 × 1080 1920 \times 1080 1920×1080

    namedWindow

    void cv::namedWindow(const String& winname,
    	int 	flags = WINDOW_AUTOSIZE
    )
    
    • 1
    • 2
    • 3

    resizeWindow

    void cv::resizeWindow(const String& winname,
    	int 	width,
    	int 	height
    )
    
    • 1
    • 2
    • 3
    • 4

    moveWindow

    void cv::moveWindow(const String& winname,
    	int 	x,
    	int 	y
    )
    
    • 1
    • 2
    • 3
    • 4

    参考文献:

    1. 关于opencv读取摄像头的未解之谜
    2. Python+Opencv读取高帧率USB摄像头问题
  • 相关阅读:
    [附源码]计算机毕业设计JAVA小超市进销存管理系统
    Android数据双向绑定
    mysql数据库转PostgreSQL,批量处理xml中的sql,字段加上双引号脚本。
    解析Collection接口中的常用的被实现子类重写的方法
    MATLAB嵌套if语句||MATLAB switch语句
    压力之下番茄也会「惊声尖叫」,特拉维夫大学发现植物王国不沉默
    js去除数组对象中的重复对象
    Hbase容灾与备份
    Tuxera Ntfs For Mac 2023的具体使用方法
    shell 的 ${ }中 ##、%%、// 使用方法及举例
  • 原文地址:https://blog.csdn.net/Star_ID/article/details/126783918