c++ - 图像数据矩阵中的偏移值及其对整数值的影响

标签 c++ c opencv matrix

目前我正在尝试了解 OpenCV 的人脸检测 API DetectionBasedTracker。在代码里面,我找到了定义

#define CALC_SUM_(p0, p1, p2, p3, offset) \
    ((p0)[offset] - (p1)[offset] - (p2)[offset] + (p3)[offset])

我无法弄清楚以下内容

(1)p0、p1、p2、p3 是整数值。 (p0)[offset] 的返回值是什么,它有什么作用?

(2)offset实际上是图像矩阵一行中整数的个数。假设图像矩阵是 480 x 640。一行图像数据中有 640 个整数值。对于第二行,offset = 640。它的计算公式为 offset = pt.y * ((int)image.step/sizeof(int)) + pt.x;通过改变偏移值(p0)[offset]是如何起作用的?

最佳答案

我的猜测是 p0 不是整数,而是一维数组。

如果这是正确的,宏将计算 offset 的“总和”数组中的第 th 项 p0 , p1 , p2 , 和 p3 , 除了因为所有这些 - 而这是一个奇怪的总和迹象。

已编辑:现在已查看相关代码

我发现代码很难理解,但我们还是试试吧:

我的结论是p0[offset]是指向图像中像素的指针(整数值)。该像素是图像中矩形的一个角。 p1[offset] , p2[offset] , 和 p3[offset]是指向同一矩形其他角上的像素的指针。

更详细...

CALC_SUM_CALC_SUM 调用在很多地方都被调用,比如在HaarEvaluator::Feature :: calc .

在那calc功能,CALC_SUMp[0] 调用作为论据。 pstruct Feature 中定义作为const int* p[RECT_NUM][4] , 所以 p[0]是指向 int 的四个指针的数组

这四个可能是什么int是吗?好吧,在 Feature 之后它们是未定义的调用构造函数,因为指针设置为 NULL。

但假设 HaarEvaluator::Feature :: updatePtrs在某个时候被调用,指针由 CV_TILTED_PTRS 更新或 CV_SUM_PTRS宏。

这两个宏都带有一个指向值的矩阵的指针,我假设它是图像中的像素矩阵(给定手头的任务,即在图像中查找特征) .该指针称为 titledsum .让我们一起工作 sum . p[0]中的四个指针由 CV_SUM_PTRS 设置指向 sum 内矩形的四个角.

calc调用函数时,四个指针( p[0] 包含四个指向角的指针 p[0][0] - p[0][3] )与偏移量一起传入。这个偏移量被有效地添加到四个指针中的每一个,使用数组符号,移动图像周围的矩形。

实际总和看起来像是在进行描述的快速计算 here .

关于c++ - 图像数据矩阵中的偏移值及其对整数值的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285068/

相关文章:

python - 与 Photoshop 相比,OpenCV Warpaffine 的质量较低

opencv - 在RealSense库中将红外图像映射为彩色图像

c++ - 如何从 const char* 转换为 unsigned int c++

c - 如何从 C 中的 gtk TreeView /列表存储中获取所有数据?

c - 局部变长数组

xml - 如何使用 OpenCV 生成用于对象检测的 HarrCascade XML?

c++ - 在 C++ 控制台应用程序中计算单词中的字符数

c++ - 添加对 boost::fusion::vector 的引用

c++ - TravisCI 中的混合 C 和 C++ 项目

c - NULL 指针被随机修改为 0x62 或类似的