OpenCV迭代列

时间:2014-03-12 20:11:04

标签: c++ opencv iterator

我正在尝试迭代矩阵的列(例如,它连接成矩阵的一堆列向量,并且我希望分别对每个列向量进行操作)。使用for循环很容易做到这一点:

for(int n = 0; n < mat.cols; n++)
{
    cv::Mat c = mat.col(n);
    // do stuff to c
}

但是如果可能的话我想使用迭代器这样做,以便我可以使用std :: accumulate或std :: transform来简化我的代码。

所以我基本上都在寻找像

这样的东西
for each Mat c in mat.columns

Mat具有begin<>end<>功能,但据我所知,它只能用于迭代单个元素。

这可以以某种方式完成吗?

为了清楚起见我想写

cv::Mat input;

cv::Mat output = std::accumulate(input.begincols(), input.endcols(), cv::Mat::zeros(n,k,CV_64F),
[](const cv::Mat &acum, const cv::Mat &column) { return acum + column * 5; });

举个简单的例子。

更新

所以既然没有得到回答,如果有人有本土解决方案来提供这样的迭代器,我会看看,否则如果我有机会我可能会自己调查

3 个答案:

答案 0 :(得分:1)

也许重载累积功能可以提供帮助。而不是(可能实施标准)

template<class InputIt, class T>
T std::accumulate(InputIt first, InputIt last, T init)
{
   for (; first != last; ++first) {
        init = init + *first;
   }
   return init;
}

你可以写自己的,累积。

template<class InputIt, class T>
T std::accumulate(InputIt first, InputIt last, T init, std::size_t incr)
{
   for (; first != last; first += incr) {
        init = init + *first;
   }
   return init;
}

将其用于图像。你必须使用步长(Math :: step1()我猜)为incr。这应该工作,但我还没有测试过。请提供反馈,如果它适合您。

答案 1 :(得分:1)

问题是,cv :: Mat图像可以有一个偏移量(size(row)!= step())。也许您想要创建一个数据结构,其中包含指向每行开头的指针数组(例如,由Mat :: ptr创建),然后您可以执行类似的操作:

std::vector<uchar*> matRows( mat.rows );
// init matRows via mat.ptr
//....

for (auto i : matRows)
    std::transform( i.begin(), i.begin() + mat.cols, i.begin(), my_trafo);

状态:未测试

答案 2 :(得分:0)

自从我发布这个问题以来已经有两年了,但我终于开始写这样的图书馆了。你可以在这里找到它

https://gitlab.com/Queuecumber/opencvit

在MIT许可下,它作为易于使用的opencv伴随库分发。示例在自述文件中,对于了解STL的人员应该非常直观。现在它提供column_iteratorrow_iterator,但还有更多可能性。如果有人有建议或发现错误,请在回购中留下问题。

相关问题