OpenCV iterate over columns

OpenCV iterate over columns

本文关键字:columns over iterate OpenCV      更新时间:2023-10-16

我正试图迭代矩阵的列(例如,它是一堆列向量,连接成一个矩阵,我想对每个列向量分别操作)。使用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; });

举个简单的例子

更新:

既然这个问题还没有答案,如果有人有自己的解决方案来提供这样的迭代器,我会看看或者如果有机会,我可能会自己看看

也许重载accumulate函数会有帮助。而不是(可能实现的标准)

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;
}

将其用于您的图像。对于incr,您必须使用步长(Math::step1()我猜)。这应该可以工作,但我还没有测试过。

问题是,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);

状态:NOT testing

好吧,这是大约2年以来,我发布了这个问题,但我终于有时间写这样一个库。你可以在这里找到

https://gitlab.com/Queuecumber/opencvit

它是作为一个易于使用的openv的配套库在MIT许可下发布的。示例在自述中,对于了解STL的人来说应该非常直观。现在它提供了column_iteratorrow_iterator,但还有更多的可能性。如果任何人有建议或发现错误,请在repo上留下问题。