我想编写一个使用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/