Bayer.txt
上传用户:yanxiao
上传日期:2022-08-10
资源大小:1k
文件大小:3k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. W7WMJB
  2. 1.函 数:ConvertBayer2RGB
  3. 原 型:void __stdcall ConvertBayer2RGB(BYTE *pDest,BYTE *pSrce,int nWidth,
  4. int nHeight,BYTE pLutR[256],BYTE pLutG[256],
  5. BYTE pLutB[256])
  6. 参 数:
  7. BYTE *pDest; 指向目标图像数据区,RGB24格式。
  8. BYTE *pSrce; 指向源图像数据区,Bayer格式。
  9. int nWidth; 图像宽度。
  10. int nHeight; 图像高度。
  11. HV_BAYER_CONVERT_TYPE cvType; 插值算法类型。
  12. BYTE pLutR[256]; 红色分量查找表。
  13. BYTE pLutG[256]; 绿色分量查找表。
  14. BYTE pLutB[256]; 蓝色分量查找表。
  15. 返回值:无。
  16. 说 明:将源缓冲区的Bayer格式图像数据进行数据格式转换并传递到目标缓冲区
  17. 中。源缓冲区的图像为8位通道的Bayer格式数据,转换后存储在目标缓冲区的数据为
  18. RGB24位格式。
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <stdint.h>
  22. #include <unistd.h>
  23. #include <sys/mman.h>
  24. #include <sys/types.h>
  25. #include <sys/stat.h>
  26. #include <fcntl.h>
  27. #include <sys/ioctl.h>
  28. #include <string.h>
  29. #include <sys/select.h>
  30. #define u8 uint8_t
  31. #define u16 uint16_t
  32. #define u32 uint32_t
  33. static uint8_t rgb[640*480*3];
  34. #define R(x,y) pRGB24[0 + 3 * ((x) + 640 * (y))]
  35. #define G(x,y) pRGB24[1 + 3 * ((x) + 640 * (y))]
  36. #define B(x,y) pRGB24[2 + 3 * ((x) + 640 * (y))]
  37. #define Bay(x,y) pBay[(x) + 640 * (y)]
  38. static void bayer_copy(u8 *pBay, u8 *pRGB24, int x, int y)
  39. {
  40. G(x + 0, y + 0) = Bay(x + 0, y + 0);
  41. G(x + 1, y + 1) = Bay(x + 1, y + 1);
  42. G(x + 0, y + 1) = G(x + 1, y + 0) = ((u32)Bay(x + 0, y + 0) + (u32)Bay(x + 1, y + 1)) / 2;
  43. R(x + 0, y + 0) = R(x + 1, y + 0) = R(x + 1, y + 1) = R(x + 0, y + 1) = Bay(x + 0, y + 1);
  44. B(x + 1, y + 1) = B(x + 0, y + 0) = B(x + 0, y + 1) = B(x + 1, y + 0) = Bay(x + 1, y + 0);
  45. }
  46. static void bayer_bilinear(u8 *pBay, u8 *pRGB24, int x, int y)
  47. {
  48. R(x + 0, y + 0) = ((u32)Bay(x + 0, y + 1) + (u32)Bay(x + 0, y - 1)) / 2;
  49. G(x + 0, y + 0) = Bay(x + 0, y + 0);
  50. B(x + 0, y + 0) = ((u32)Bay(x - 1, y + 0) + (u32)Bay(x + 1, y + 0)) / 2;
  51. R(x + 0, y + 1) = Bay(x + 0, y + 1);
  52. G(x + 0, y + 1) = ((u32)Bay(x + 0, y + 0) + (u32)Bay(x + 0, y + 2)
  53.  + (u32)Bay(x - 1, y + 1) + (u32)Bay(x + 1, y + 1)) / 4;
  54. B(x + 0, y + 1) = ((u32)Bay(x + 1, y + 0) + (u32)Bay(x - 1, y + 0)
  55.  + (u32)Bay(x + 1, y + 2) + (u32)Bay(x - 1, y + 2)) / 4;
  56. R(x + 1, y + 0) = ((u32)Bay(x + 0, y + 1) + (u32)Bay(x + 2, y + 1)
  57.  + (u32)Bay(x + 0, y - 1) + (u32)Bay(x + 2, y - 1)) / 4;
  58. G(x + 1, y + 0) = ((u32)Bay(x + 0, y + 0) + (u32)Bay(x + 2, y + 0)
  59.  + (u32)Bay(x + 1, y - 1) + (u32)Bay(x + 1, y + 1)) / 4;
  60. B(x + 1, y + 0) = Bay(x + 1, y + 0);
  61. R(x + 1, y + 1) = ((u32)Bay(x + 0, y + 1) + (u32)Bay(x + 2, y + 1)) / 2;
  62. G(x + 1, y + 1) = Bay(x + 1, y + 1);
  63. B(x + 1, y + 1) = ((u32)Bay(x + 1, y + 0) + (u32)Bay(x + 1, y + 2)) / 2;
  64. }
  65. static void bayer_to_rgb24(u8 *pBay, u8 *pRGB24)
  66. {
  67. int i, j;
  68. for (i = 0; i < 640; i += 2)
  69. for (j = 0; j < 480; j += 2)
  70. if (i == 0 || j == 0 || i == 640 - 2 || j == 480 - 2)
  71. bayer_copy(pBay, pRGB24, i, j);
  72. else
  73. bayer_bilinear(pBay, pRGB24, i, j);
  74. }
  75. void writepnm(uint8_t *data, int i)
  76. {
  77. FILE *fd;
  78. char name[32];
  79. sprintf(name, "p5-%04d.pnm", i);
  80. fd = fopen(name, "w");
  81. fputs("P6n", fd);
  82. fputs("640 480n", fd);
  83. fputs("255n", fd);
  84. fwrite(data, 640*480*3, 1, fd);
  85. fclose(fd);
  86. }
  87. int main(void)
  88. {
  89. int fdi;
  90. u8 *ibot;
  91. if ((fdi = open("bayer.raw", O_RDONLY)) < 0) {
  92. perror("open");
  93. return -1;
  94. }
  95. if ((ibot = mmap(NULL, 640 * 480 + 640*4, PROT_READ, MAP_SHARED, fdi, 0)) == MAP_FAILED) {
  96. perror("mmap");
  97. return -1;
  98. }
  99. bayer_to_rgb24(ibot, rgb);
  100. writepnm(rgb, 0);
  101. close(fdi);
  102. return 0;
  103. }