图像数据矩阵中的偏移值及其对整数值的影响
Posted
技术标签:
【中文标题】图像数据矩阵中的偏移值及其对整数值的影响【英文标题】:Offset value in Image data matrix and its effect on integer value 【发布时间】:2014-12-04 02:07:11 【问题描述】:目前我正在尝试了解 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
;通过更改offset value
,(p0)[offset]
有什么效果?
【问题讨论】:
【参考方案1】:我的猜测是p0
不是一个整数,而是一个一维数组。
如果正确,该宏将计算数组p0
、p1
、p2
和p3
中offset
th 项的“总和”,只是它是一个奇怪的总和,因为在所有这些-
标志中。
已编辑:现在查看了相关代码
我发现代码很难理解,但我们还是试试吧:
我的结论是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
s 的指针组成的数组。
这四个int
s 可能是什么?好吧,在调用 Feature
构造函数后它们立即未定义,因为指针被设置为 NULL。
但假设 HaarEvaluator::Feature :: updatePtrs
已在某个时候被调用,则指针由 CV_TILTED_PTRS
或 CV_SUM_PTRS
宏更新。
这两个宏都带有一个指向 matrix 值的指针,我假设它是图像中的像素矩阵(考虑到手头的任务,即在图像中查找特征) .该指针称为titled
或sum
。让我们使用sum
。 p[0]
中的四个指针由CV_SUM_PTRS
设置,指向sum
中矩形的四个角。
当调用calc
函数时,四个指针(p[0]
包含指向角点的四个指针p[0][0]
-p[0][3]
)连同一个偏移量一起传入。这个偏移量有效地添加到四个指针中的每一个,使用数组表示法,它围绕图像移动矩形。
实际总和看起来可以进行here 中描述的快速计算。
【讨论】:
查看cascadedetect.hpp
,它看起来很像p0
是一个指向整数的指针。参见struct Feature
中的const int* p[RECT_NUM][4];
行。你认为它是整数的依据是什么?
是的,你是对的。我在第 190 行使用 LBPEvaluator。实际上 p 是 const int* p[16];内部特征结构。每个 p[i] 都是指向整数的指针。但只指向一个整数。那么 (p0)[offset] 做了什么?因为它只指向一个整数。
我已编辑我的答案以尝试解决您的第二个问题。如果你有一个指针 x
,x[offset]
将 offset
添加到指针(不是指向的值,而是指针本身)。
...并在指针中添加了offset
,它被取消引用,以便您在该位置获得整数值。
是的 p0 指向整数数组。我在#define CV_SUM_PTRS(p0, p1, p2, p3, sum, rect, step) (line37, cascadedetect.hpp) 找到了以上是关于图像数据矩阵中的偏移值及其对整数值的影响的主要内容,如果未能解决你的问题,请参考以下文章