有条件地调用cv :: VideoCapture构造函数

时间:2017-12-05 21:17:24

标签: c++ opencv

我想有条件地调用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这样做,这样我就不必在程序结束时自由释放记忆了吗?

2 个答案:

答案 0 :(得分:5)

你过度复杂了。使用open

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

在三元运算符中,两个操作数必须属于同一类型。有关详细信息,请参阅here。但是你的类型为intchar*,因此,即使代码可能会编译,也会导致运行时错误。

答案 1 :(得分:1)

表达式A ? B : C的返回类型为BC必须隐式转换为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));