我想编写一个使用cv::InputArray作为参数的自定义函数。
在函数中,我了解可以使用cv::InputArray::getMat来获取输入cv::Mat的 header 。

在将std::vector传递到cv::InputArray时,我有些困惑。

1.如果我将std::vector传递给函数,是否仍可以在函数中获取std::vector?例如:

void foo(cv::InputArray _input)
{
    std::vector<cv::Point2f> input = _input.getVector() // getVector function doesn't exist
}

std::vector<cv::Point2f> a;
foo(a);

2.如果我将std::vector传递给函数,并使用getMat在函数内获取cv::Mat,则垫子的外观如何?

Poly对std::vector<char>进行了清楚的解释。如果我想在函数中获取std::vector<cv::Point2f>,该怎么办?

非常感谢。

最佳答案

当将vector传递给采用InputArray的函数时,您将隐式调用转换构造函数InputArray::InputArray(vector)。 (在此处解释转换构造函数:https://stackoverflow.com/a/15077788/928387)

在此构造函数中, vector 的指针仅分配给InputArray中的obj成员变量。如果使用OpenCV 3.0,则InputArray具有getObj()方法,因此可以通过以下方式获取 vector :

// Only works on OpenCV 3.0 or above
const std::vector<Point2f>& input = *(const std::vector<Point2f>*)_input.getObj();

如果使用OpenCV 2.X,则可以使用InputArray::getMat()。它返回具有指向数据的指针的Mat对象。因此,您也可以按照以下方式进行操作。
// Should Work on any OpenCV version
cv::Mat mat = _input.getMat();
Point2f *data = (Point2f *)mat.data;
int length = mat.total();
std::vector<Point2f> input;
input.assign(data, data + length);

关于第二个问题,如果在具有N个元素的InputArray对象上调用InputArray::getMat(),它将返回(N * 1)矩阵。

关于c++ - 传递opencv inputarray并将其用作std::vector,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25750041/

10-09 08:43