51 lines
2.2 KiB
Plaintext
51 lines
2.2 KiB
Plaintext
接口使用:
|
||
|
||
/**
|
||
* @brief Computes pixel flow from image1 to image2
|
||
*
|
||
* Searches the corresponding position in the new image (image2) from the old image (image1)
|
||
* and calculates the average offset of all.
|
||
*
|
||
* @param image1 previous image buffer
|
||
* @param image2 current image buffer (new)
|
||
|
||
*
|
||
* @return quality of flow calculation, 表示置信度 0-255
|
||
*
|
||
*/
|
||
uint8_t compute_flow(uint8_t *image1, uint8_t *image2, int32_t *pixel_flow_x, int32_t *pixel_flow_y)
|
||
|
||
|
||
1. 输出估算出来的偏移值,int32_t *pixel_flow_x, int32_t *pixel_flow_y,已经经过定点话,小数点4位,也可以通过宏FIXED_PRECISE来重定义精度;
|
||
|
||
2. 分辨率最大可支持到512x512, 最小是64x64, 性能在dv12大概是100fps, 性能与分辨率无关;
|
||
|
||
3. 为了得到较好的结果,建议是将输入图像720P, 扣出中间区域720x720,然后缩放成256x256, 再扔去计算,保证纹理的丰富性;
|
||
|
||
|
||
|
||
算法流程:
|
||
|
||
1. 图像大小为64x64 - 512x512;
|
||
2. 将图像分割为8x8子块;对每个子块做如下动作:
|
||
3. 评价像素内部梯度(即相邻像素差异);即描述纹理是否丰富;
|
||
若纹理不够丰富,对该块不做统计;若纹理丰富,继续下面步骤;
|
||
4. 寻找8x8子块的水平/垂直正负四个像素的最佳匹配块;
|
||
5. 若最佳匹配块的相似度仍然太大,丢弃这个块;若最佳匹配块的匹配度足够高,继续下面步骤;
|
||
6. 记录该块的匹配位移,并计算8个半像素位置的最佳匹配位置;其中半像素位置如下定义(p为整像素)
|
||
p p p p p
|
||
p 5 6 7 p
|
||
p 4 p 0 p
|
||
p 3 2 1 p
|
||
p p p p p
|
||
|
||
7. 如果最佳匹配半像素位置0/1/7, 则匹配位移水平方向+1, 若为3/4/5,则-1;
|
||
如果最佳匹配半像素位置1/2/3, 则匹配位移垂直方向+1, 若为5/6/7,则-1;
|
||
将最终得到的半像素精度匹配位移做计数(直方图统计);
|
||
|
||
8. 重复3-7,直到所有子块做完,得到各种位移的计数;
|
||
|
||
9. 用两个方法来得到最后的位移:
|
||
1) 所有位移技术的算术平均值;
|
||
2) 取计数最大的位移附近的几个计数做加权平均;
|