[英]Can't change OpenCV video capture resolution
我遇到的問題是我無法更改 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()
來更改寬度和高度。
這取決於您的相機后端是什么。 正如文檔所說:
每個后端都以不同的方式支持設備屬性 (cv::VideoCaptureProperties),或者可能根本不支持任何屬性。
本文檔中還提到:
讀/寫屬性涉及很多層。 沿着這條鏈可能會發生一些意想不到的結果。 有效行為取決於設備硬件、驅動程序和 API 后端。
OpenCV 視頻 I/O 模塊似乎不支持您的相機后端。
注意:我也遇到過這樣的相機,其中一些不同的分辨率正在使用不同的數字。 例如,您可以通過嘗試VideoCaptur(-1)
、 VideoCapture(1)
、 VideoCapture(2)
...
結果發現錯誤出在“if(!cap.open(0))”行中,我試圖用它來檢查 cap 是否已成功初始化。
我的印象是,如果視頻捕獲對象是打開的,則 open 只是返回 true,否則返回 false。 但如果它已經打開,它實際上會釋放視頻捕獲對象,然后它會重新打開它。
長話短說,這意味着當使用 cap.open(0) 重新打開對象時,我用來更改分辨率的 cap.set() 調用將被刪除。 此時分辨率被設置回默認的 640x480。
我正在尋找的方法是 cap.isOpened(),如果對象處於打開狀態,它只會返回 true 或 false。 一個簡單而愚蠢的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.