簡體   English   中英

有條件地調用cv :: VideoCapture構造函數

[英]Call cv::VideoCapture constructor conditionally

我想有條件地調用cv::VideoCapture構造函數。 如果argc == 2 ,那么用戶已經指定了一個視頻文件,我想加載它。 否則,請使用默認相機。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char* argv[])
{
    VideoCapture cap(argc == 2 ? argv[1] : 0);

    return 0;
}

我編譯並運行它

$ g++ -g -Wall -o main main.cpp `pkg-config opencv --cflags --libs`
$ ./main

但是可悲的是它似乎沒有用,我明白了

OpenCV: Couldn't read movie file ""

三元運算符在一種情況下返回字符串,在另一種情況下返回整數。 我認為這是行不通的,因為我不了解C ++構造函數的某些特質。

做我想做的最干凈的方法是什么? 我可以在不使用new這樣做嗎,這樣我就不必在程序結束時釋放內存了嗎?

您太復雜了。 使用open

VideoCapture cap;
if(argc == 2) {
    cap.open(argv[1]); // calls: open(const String& filename)
} else {
    cap.open(0);       // calls: open(int index) 
}

在三元運算符中,兩個操作數必須具有相同的類型 有關詳細信息,請參見此處 但是您的類型為intchar* ,因此,即使代碼可以編譯,也可能導致運行時錯誤。

表達式A ? B : C A ? B : C的返回類型為B並且C必須隱式轉換為B 有些編譯器將不編譯(最佳行為),有些編譯器將不編譯。 在您的情況下, B = char *C = int 我相信0被解釋為指向地址0或NULL的指針,其字節等於'\\0'即以空終止符表示C樣式字符串的結尾,因此為空字符串。

如果您堅持采用單線運輸,則:

std::unique_ptr<VideoCapture> capture = (argc == 2 ? std::make_unique<VideoCapture>(argv[1]) : std::make_unique<VideoCapture>(0));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM