[cpp] view plaincopy
  1. /*************************************************
  2. * 主要功能:两路 YUV4:2:0拼接一路左右半宽格式YUV视频
  3. 参考资料:http://www.pudn.com/downloads271/sourcecode/multimedia/vfw/detail1237363.html
  4. U_size=V_size=Y_size/2
  5. *************************************************/
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #define PREWEIGHT 1920
  10. #define PREHEIGHT 1080
  11. #define RESWEIGHT 3840
  12. #define RESHEIGHT 1080
  13. #define PREYSIZE ((PREWEIGHT)*(PREHEIGHT))
  14. #define PREUSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))
  15. #define PREVSIZE ((PREWEIGHT/2)*(PREHEIGHT/2))
  16. #define RESYSIZE ((RESWEIGHT)*(RESHEIGHT))
  17. #define RESUSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))
  18. #define RESVSIZE ((RESWEIGHT/2)*(RESHEIGHT/2))
  19. #define PRESIZE ((PREYSIZE)+(PREUSIZE)+(PREVSIZE))
  20. #define RESSIZE ((RESYSIZE)+(RESUSIZE)+(RESVSIZE))
  21. int GetFrameNum(const char *File)
  22. {
  23. FILE *fp;
  24. int size=0;
  25. if (!(fp=fopen(File,"rb")))
  26. {
  27. printf("Open %s error !",File);
  28. exit(1);
  29. }
  30. else
  31. {
  32. fseek(fp,0,SEEK_END);/*将文件指针移到YUV文件的末尾*/
  33. size=ftell(fp);/*计算文件的总大小*/
  34. }
  35. return (size/PRESIZE);
  36. }
  37. void ReadYUV(char *ResBuf,char *PreBuf,int resstart,int prestart,int resoffset,int preoffset,int size,int height)
  38. {
  39. int k;
  40. for (k=0;k<height;k++)
  41. {
  42. //注意这里用memmov不用strncpy
  43. memmove(ResBuf+resstart+k*(resoffset),PreBuf+prestart+k*(preoffset),size);
  44. }
  45. }
  46. int main(int argc,char *argv[])
  47. {
  48. /*两路YUV文件名*/
  49. const char *FileName[]={"e:\BMX_L_1920x1080_240frms.yuv","e:\BMX_R_1920x1080_240frms.yuv"};
  50. FILE *FileResult;/*输出文件名*/
  51. FILE** fp_combine=(FILE**)malloc(sizeof(FILE *)*3);/*申请文件指针*/
  52. int *FileFrameNum=(int *)malloc(sizeof(int)*3);/*每个YUV的帧数*/
  53. char *PreBuf=(char *)malloc(sizeof(char)*(PRESIZE+1));/*处理前每一帧图像的大小*/
  54. char *ResBuf=(char*)malloc(sizeof(char)*(RESSIZE+1));/*处理后每一帧图像的大小*/
  55. int Y_start_section=0;/*预处理图片Y分量存入目标区域的起始区域*/
  56. int U_start_section = 0;/*预处理图片U分量存入目标区域的起始区域*/
  57. int V_start_section = 0;/*预处理图片V分量存入目标区域的起始区域*/
  58. int File_offset = 0;/*预处理文件偏移值*/
  59. int i_combine=0,j_combine=0,k_combine=0;/*控制循环*/
  60. /*判断申请内存是否成功*/
  61. if (!((fp_combine)&&(FileFrameNum)&&(PreBuf)&&(ResBuf)))
  62. {
  63. printf("Allocate memeroy Faile !");
  64. exit(1);
  65. }
  66. /*初始化申请空间*/
  67. memset(fp_combine,0,sizeof(FILE *)*2);
  68. memset(FileFrameNum,0,sizeof(int)*2);
  69. memset(PreBuf,0,sizeof(char)*PRESIZE);
  70. memset(ResBuf,0,sizeof(char)*RESSIZE);
  71. if (!(FileResult=fopen("hua_result.YUV","wb")))/*创建输出文件*/
  72. {
  73. printf("Creat File faile !");
  74. exit(1);
  75. }
  76. for (i_combine=0;i_combine<2;i_combine++)
  77. {
  78. if(!(fp_combine[i_combine]=fopen(FileName[i_combine],"rb")))/*打开输入文件*/
  79. {
  80. printf("Open File %s Faile !",FileName[i_combine]);
  81. exit(1);
  82. }
  83. else
  84. {
  85. FileFrameNum[i_combine]=GetFrameNum(FileName[i_combine]);/*存储每一个视频的帧数*/
  86. }
  87. }
  88. i_combine=0;
  89. k_combine=FileFrameNum[i_combine];
  90. while (i_combine<k_combine)
  91. {
  92. File_offset = i_combine*PRESIZE;
  93. j_combine=0;
  94. while (j_combine<2)
  95. {
  96. fseek(fp_combine[j_combine],File_offset,SEEK_SET);/*移动文件指针至需要处理的数据的位置*/
  97. fread(PreBuf,1,PRESIZE,fp_combine[j_combine]);/*读取一幅图像*/
  98. if (j_combine==0)
  99. {
  100. /*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/
  101. Y_start_section=0;
  102. U_start_section=RESYSIZE;
  103. V_start_section=RESYSIZE+RESUSIZE;
  104. }
  105. else
  106. {
  107. /*把读取预处理图片Y/U/V分量的起始位置放置目标对应位置*/
  108. Y_start_section=PREWEIGHT;
  109. U_start_section=RESYSIZE+PREWEIGHT/2;
  110. V_start_section=RESYSIZE+RESUSIZE+PREWEIGHT/2;
  111. }
  112. /*分别读Y、U、V*/
  113. ReadYUV(ResBuf,PreBuf,Y_start_section,0, RESWEIGHT,PREWEIGHT,PREWEIGHT,PREHEIGHT);
  114. ReadYUV(ResBuf,PreBuf,U_start_section,PREYSIZE, RESWEIGHT/2,PREWEIGHT/2,PREWEIGHT/2,PREHEIGHT/2);
  115. ReadYUV(ResBuf,PreBuf,V_start_section,PREYSIZE+PREUSIZE, RESWEIGHT/2,PREWEIGHT/2,PREWEIGHT/2,PREHEIGHT/2);
  116. j_combine++;
  117. }
  118. fwrite(ResBuf,1,RESSIZE,FileResult);
  119. fflush(FileResult);
  120. i_combine++;
  121. }
  122. fclose(fp_combine[0]);
  123. fclose(fp_combine[1]);
  124. fclose(FileResult);
  125. return 0;
  126. }

2个YUV视频 拼接技术相关推荐

  1. 2个YUV视频拼接技术

    http://blog.csdn.net/huahuahailang/article/details/9040847 2个YUV视频拼接技术 http://zhongcong386.blog.163. ...

  2. 【作业】RGB/BMP转YUV格式及YUV视频拼接

    简介 RGB文件 RGB文件是原始的没有压缩的包含红绿蓝三种颜色的图像文件. 常见的RGB格式例如RGB24,也就是一组RGB像素中的R.G.B各占8比特,即一个字节,一组RGB一共是24个比特. 这 ...

  3. 全景视频拼接关键技术

    全景视频拼接关键技术 一.原理介绍 图像拼接(Image Stitching)是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图,图像拼接技术涉及到计算机视觉.计算 ...

  4. 全景视频拼接算法参考资料

    知乎回答<目前最成熟的全景视频拼接技术是怎样的?> https://www.zhihu.com/question/34573969/answer/122797987 知乎回答<图像拼 ...

  5. android 视频整合,Android 视频合拍技术

    视频合拍技术,腾讯短视频sdk上叫做合唱,阿里的叫视频合拍,简单的说就是看到一段小视频,想利用本视频再次录制一个视频,实现达到左边是自己,右边是观看的视频的一个合集视频(上下也行,随便放哪儿),这种技 ...

  6. 多个视频画面拼接技术

    ____YUV主要采样格式理解 主要的采样格式有YCbCr 4:2:0.YCbCr 4:2:2.YCbCr 4:1:1和 YCbCr 4:4:4.其中YCbCr 4:1:1 比较常用,其含义为:每个点 ...

  7. 全景视频拼接(一)--关键技术流程

     原文: http://blog.csdn.net/shanghaiqianlun/article/details/12090595 全景视频拼接关键技术 一.原理介绍 图像拼接(Image St ...

  8. 全景视频拼接的关键技术与发展优势、作用、应用。

    全景视频拼接是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图.全景视频技术涉及到计算机视觉.计算机图形学.数字图像处理以及一些数学工具等技术.全景拼接基本步骤主要 ...

  9. 全景视频拼接的关键技术与步骤

    全景视频拼接是一种利用实景图像组成全景空间的技术,它将多幅图像拼接成一幅大尺度图像或360度全景图.全景视频技术涉及到计算机视觉.计算机图形学.数字图像处理以及一些数学工具等技术.全景拼接基本步骤主要 ...

  10. FPGA HLS双线性插值图像缩放视频拼接,上板验证稳定通过,提供3套工程源码和技术支持

    目录 1.前言 2.HLS实现双线性插值图像缩放 3.vivado工程1:1080P缩小720P 4.vivado工程2:1080P缩小后mixer二分频 5.上板调试验证并演示 6.福利:工程代码的 ...

最新文章

  1. Windbg、dump分析类资源链接
  2. 各路资本暗战智能家居
  3. 二叉树的前、中、后、层序遍历整理(Java版本)
  4. detectandcompute 图像尺寸太大_基于深度局部特征的图像检索
  5. MySQL--开发技巧(一)
  6. 课堂上老师不讲的有趣物理知识,才是孩子最感兴趣的!
  7. android chrome 不支持 audio/video的autoplay 属性
  8. synchronized的使用和底层原理、锁状态的膨胀升级过程
  9. Android项目实战(三十六):给背景加上阴影效果
  10. 前端框架这么火,还有必要学好原生 JavaScript 吗?
  11. 深度学习之激活函数篇(Sigmoid、tanh、ReLU、PReLU)
  12. c++ class 类名 和 include 的区别
  13. Window.localStorage
  14. GO语言-第二节-顺序编程
  15. 牛逼啊!一顿火锅钱+一台旧手机 = 自主导航机器人?
  16. 概率统计16——均匀分布、先验与后验
  17. CSDN写博客如何自动插入目录
  18. 基于matlab的语音信号去噪毕业论文,MATLAB的FIR数字滤波器语音信号的去噪研究和仿真...
  19. 欧姆龙plc多轴伺服控制程序fb 欧姆龙PLC CP1H 5轴+1转盘电机4工位程序
  20. RHCSA 8考题超级详细解析(2022最新版)本人已过

热门文章

  1. Naive Bayes text classification
  2. js替换问题replace和replaceAll
  3. [转]MSSQL CURSOR (游标) 笔记
  4. 为什么每个邮件收到后都会有一个htm的附件_职场邮件:领导、同事都喜欢收到的邮件丨邮件技巧...
  5. 400是什么错误_404、403、405、500 | 常见网页错误代码解析
  6. stack(栈)数据结构详解
  7. 蓝桥杯 剪邮票(dfs枚举 + bfs)
  8. 控制输入,非法字符不能输入到TextBox.
  9. C#3.0亮点 —— lambda表达式
  10. 翻书插件:bookblock.js