c++ - 传递 opencv inputarray 并将其用作 std::vector

标签 c++ opencv vector

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

我在将 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,垫子会是什么样子?

保利对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/

相关文章:

c++ - 计算 vector 中的相似整数

c# - 用于多平台大型软件开发的编程语言?

python cv2.findContours 在简单的灰度图像中查找轮廓效果不佳

java - java中用opencv绘制的图像直方图

c++ - Python PIL Image.tostring ('raw' ) 和 OpenCV 的 IplImage->imageData

c++ - 是否需要将 delete 用于在 vector 中创建的新数组?

c++ - 为什么在初始化和调整对象 vector 大小时调用析构函数?

c++ - 使用 openGL 缩放和移动 3d 对象

c++ - 默认情况下全局变量是extern还是相当于在全局中用extern声明变量?

c++ - 重启后注册表项被删除