收藏 分享(赏)

整像素运动估计的C语言代码,可用于FPGA验证.docx

上传人:s36f12 文档编号:6102961 上传时间:2019-03-27 格式:DOCX 页数:11 大小:34.83KB
下载 相关 举报
整像素运动估计的C语言代码,可用于FPGA验证.docx_第1页
第1页 / 共11页
整像素运动估计的C语言代码,可用于FPGA验证.docx_第2页
第2页 / 共11页
整像素运动估计的C语言代码,可用于FPGA验证.docx_第3页
第3页 / 共11页
整像素运动估计的C语言代码,可用于FPGA验证.docx_第4页
第4页 / 共11页
整像素运动估计的C语言代码,可用于FPGA验证.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、#include #include #include #include #include #pragma warning( disable : 4996 ) #define SEEK_SET 0 #define BEG 0 /从第几帧开始#define I_FRAME 2 /读取帧#define PIC_W 176 /图像宽度#define PIC_H 144 /图像高度#define PIC_P “F:sequenceyuvforeman_qcif.yuv“/图像路径#define MB_W PIC_W / 16#define MB_H PIC_H / 16#define SAD_MAX 6

2、5536/最大sad值#define MAX(a, b) ( (a)(b) ? (a) : (b) ) /取a、b中值较大的#define MIN(a, b) ( (a)pici.plane0 = NULL;h-fp = fopen(PIC_P, “rb“);if (!h-fp)return NULL;h-pix_width = PIC_W; /像素宽h-pix_height = PIC_H; /像素高h-mb_width = h-pix_width/16; /宏块宽h-mb_height = h-pix_height/16; /宏块高return h;/预测宏块之前,初始化mvs中的sad值

3、void init_sad()int i;/初始化sad值for (i = 0; i picicnt.frame = icnt;/为存储像素分配存储空间h-picicnt.plane0 = (uint8_t*)malloc(h-pix_width * h-pix_height * 3 / 2 * sizeof(uint8_t);if (!h-picicnt.plane0) /若分配失败,返回-1 /Y分量return -1;h-picicnt.plane1 = h-picicnt.plane0 + h-pix_width * h-pix_height; /U分量h-picicnt.plane2

4、 = h-picicnt.plane1 + h-pix_width * h-pix_height / 4; /V分量/找到一帧的开头if( fseek( h-fp, (uint64_t)(icnt+BEG) * h-pix_width * h-pix_height * 3 / 2, SEEK_SET ) )return -1; /分别读取Y、U、V三个分量至内存if( fread( h-picicnt.plane0, 1, h-pix_width * h-pix_height, h-fp ) picicnt.plane1, 1, h-pix_width * h-pix_height / 4,

5、h-fp ) picicnt.plane2, 1, h-pix_width * h-pix_height / 4, h-fp ) mb_width - 1;int mby_max = h-mb_height - 1;for (mb_y = 0; mb_y pix_width;uint8_t *ref_pix;uint8_t *ref_mb, *cur_mb;/找到搜索区域sr_x0 = MAX(0, mx - 1); /搜索范围x坐标的最小值按宏块计sr_x1 = MIN(h-mb_width - 1, mx + 1); /搜索范围x坐标的最大值按宏块计sr_y0 = MAX(0, my -

6、1); /搜索范围y坐标的最小值按宏块计sr_y1 = MIN(h-mb_height - 1, my + 1);/搜索范围y坐标的最大值按宏块计/搜索范围按像素计pix_x = (sr_x1 - sr_x0) * 16;pix_y = (sr_y1 - sr_y0) * 16;adjust_range(/搜索区域左上顶点相对于中心点的位移shift_x = (mx - sr_x0) * 16;shift_y = (my - sr_y0) * 16;/找到搜索区域起始像素点ref_pix = h-pic0.plane0 + mx * 16 + my * 16 * stride- shift_x

7、 - shift_y * stride;/当前待编码宏块的起始像素位置cur_mb = h-pic1.plane0 + mx * 16 + my * 16 * stride;/按全搜索算法搜索for (i = 0; i = 0; -j)for (k = i; k = 0 partition = P_8x8;s0 = mvs4.sad + mvs5.sad;if (s = s0)s = s0;partition = P_8x16;s0 = mvs6.sad + mvs7.sad;if (s = s0)s = s0;partition = P_16x8;s0 = mvs8.sad;if (s = s0)s = s0;partition = P_16x16;/释放内存void free_yuv(yuv_t *h)int i;for (i = 0; i pici.plane0)free(h-pici.plane0);free(h);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报