我正在尝试迭代矩阵的列(例如,它连接成矩阵的一堆列向量,并且我希望分别对每个列向量进行操作)。使用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; });
举个简单的例子。
所以既然没有得到回答,如果有人有本土解决方案来提供这样的迭代器,我会看看,否则如果我有机会我可能会自己调查
答案 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_iterator
和row_iterator
,但还有更多可能性。如果有人有建议或发现错误,请在回购中留下问题。