c++ - 无法更改 OpenCV 视频捕获分辨率
问题描述
我遇到的问题是我无法更改 OpenCV 视频捕获的分辨率。无论如何,分辨率始终为 640x480。我使用的代码是用 C++ 编写的,我使用的是 opencv 3.4.8。我创建了一个超级简单的程序来执行此操作,无论我尝试什么,它似乎都不起作用。
这是完整的代码:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture cap(0);
cap.set(CAP_PROP_FRAME_HEIGHT, 1080);
cap.set(CAP_PROP_FRAME_WIDTH, 1920);
// open the default camera, use something different from 0 otherwise;
// Check VideoCapture documentation.
if (!cap.open(0))
return 0;
for (;;)
{
Mat frame;
cap.read(frame);
if (frame.empty()) break; // end of video stream
imshow("this is you, smile! :)", frame);
if (waitKey(10) == 27) break; // stop capturing by pressing ESC
}
// the camera will be closed automatically upon exit
// cap.close();
return 0;
}
当我运行上面的代码帧时总是 640x480。
我尝试将分辨率更改cap.set()
为更小和更高的分辨率。我正在使用 ImageSource 相机,并且我知道相机支持我尝试使用的分辨率,并且我可以在另一个程序中以这些分辨率查看视频。
我尝试过使用不同的相机/网络摄像头。
我在创建VideoCapture
对象时尝试显式更改后端 API - 即VideoCapture cap(0, CAP_DSHOW)
. 我试过DSHOW
, FFMPEG
,IMAGES
等。
我尝试在不同的计算机上运行相同的程序。
结果始终是相同的 640x480 分辨率。
我缺少一些简单的东西吗?我似乎可以在 SO 上找到的所有其他帖子都指向使用cap.set()
来更改宽度和高度。
解决方案
结果发现错误出现在我试图用来检查 cap 是否已成功初始化的“if(!cap.open(0))”行中。
我的印象是,如果视频捕获对象打开,则 open 只是返回 true,否则返回 false。但如果它已经打开,它实际上会释放视频捕获对象,然后重新打开它。
长话短说,这意味着当使用 cap.open(0) 重新打开对象时,我用来更改分辨率的 cap.set() 调用将被删除。此时分辨率设置回默认值 640x480。
我正在寻找的方法是 cap.isOpened(),如果对象打开,它只返回 true 或 false。一个简单而愚蠢的错误。
推荐阅读
- html - 使用 css 更改悬停时的 src 图像
- wpf - 如何更改 ComboBox 的皮肤?
- centos - 在 KVM 主机上使用 iptables 设置 nat 时,无法路由到设置为在主机启动时自动启动的 VM
- javascript - 分组条形图下的对齐标签
- sql - SQL - 使用两个表中的属性进行选择
- c++ - g++ 编译器没有为未定义的方法生成错误/警告
- docker - no matching manifest for windows/amd64 10.0.16299 in the manifest list entries error on pulling hello-world image
- python - 等待两个计算完成,然后收集两个输出并用它们做一些事情
- arm - 调试一些Armv5汇编代码时出现奇怪的内容
- c++ - 互斥锁混乱