【发布时间】:2021-12-11 16:54:16
【问题描述】:
由于某种原因,我需要多次遍历一张图像,我需要知道我处理了哪些像素点。
所以我使用 QVector 来存储我每次处理的像素点的位置,以便我可以使用它来确定下一次迭代的时间。
示例如下。
QVector<int> passed;
for(int n = 0; n < 10; n++) { // Multiple traversals
for(int y = 0; y < height; y++) {
for(int x = 0; x < width; x++) {
if(......) { // Meeting certain conditions
if(!passed.contains(y*width+x)) {
// do something
passed.append(y*width+x);
}
}
}
}
}
我花了很多时间处理passed.contains()这一步!
你知道如何优化搜索速度吗?
或者有没有更好的方法让我更容易确定已处理的某些像素?
【问题讨论】:
-
(无序)集合比线性搜索有更好的查找。所以在 QT 中,它将是
QSet. -
任何类型的无序集合、散列或集合对于普通的旧布尔数组来说都不是最佳的(在速度和内存使用方面)。查看我的解决方案。
-
您已将此问题标记为
OpenCV,因此您应该已经了解 cv::Mat -- 使用掩码图像进行查找,输入 boolean 或 uint8。将“像素”设置为 0 或 1。查找将是 O(1)。与 V.K. 的答案相同的想法,但隐藏了索引计算,因为它是图像,而不是平面数组。 -- 存储坐标是不合理的。