作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试遍历矩阵的列(例如,它是一堆连接成矩阵的列 vector ,我想分别对每个列 vector 进行操作)。使用 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;
}
将它用于您的图像。你必须使用步长(我猜是 Math::step1() )来增加。这应该有效,但我还没有测试过。如果对您有用,请提供反馈。
关于c++ - OpenCV 遍历列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22362741/
我是一名优秀的程序员,十分优秀!