OpenCV iterate over columns
OpenCV iterate over columns
我正试图迭代矩阵的列(例如,它是一堆列向量,连接成一个矩阵,我想对每个列向量分别操作)。使用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_iterator
和row_iterator
,但还有更多的可能性。如果任何人有建议或发现错误,请在repo上留下问题。
相关文章:
- 如何计算文件中的"columns"数?
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- Array.at(index) over Array[index]
- C++ Iterating Over va_list
- 在 [over.ass]/2 的例子中,为什么 *bptr = dobj2;调用 D::operator=(const B&)?
- [over.unary]/2 中注释中提到的隐藏的编译示例
- magick 对magick :: image :: columns的未定义引用
- 我们在哪里可以使用std::barrier over std::latch
- dynamic_cast over共享库在使用clang编译的Android上的Qt中失败
- 将矩阵传递给函数。 "invalid conversion from 'int (*)[columns]' to 'int' [-fpermissive]"
- MonetDB create 100.000 columns
- hbase thrift2 TGet.columns不起作用
- 为什么选择 (;;){} over while(1).
- Qt: set columns in treeView
- HBITMAP/BITMAP to BITMAPINFOHEADER -> over network - > BITMAPINFOHEADER to HBITMAP/BITMAP
- HTTP over TCP/IP?
- OpenGL 2d HUD over 3d不会渲染任何内容
- std::max_element skip over NANs
- advantage of QString over std::string
- OpenCV iterate over columns