目前我正在尝试了解 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_SUM
用 p[0]
调用作为论据。 p
在 struct Feature
中定义作为const int* p[RECT_NUM][4]
, 所以 p[0]
是指向 int
的四个指针的数组
这四个可能是什么int
是吗?好吧,在 Feature
之后它们是未定义的调用构造函数,因为指针设置为 NULL。
但假设 HaarEvaluator::Feature :: updatePtrs
在某个时候被调用,指针由 CV_TILTED_PTRS
更新或 CV_SUM_PTRS
宏。
这两个宏都带有一个指向值的矩阵的指针,我假设它是图像中的像素矩阵(给定手头的任务,即在图像中查找特征) .该指针称为 titled
或 sum
.让我们一起工作 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/