Bayer.txt
资源名称:Bayer.rar [点击查看]
上传用户:yanxiao
上传日期:2022-08-10
资源大小:1k
文件大小:3k
源码类别:
图形图像处理
开发平台:
Visual C++
- W7WMJB
- 1.函 数:ConvertBayer2RGB
- 原 型:void __stdcall ConvertBayer2RGB(BYTE *pDest,BYTE *pSrce,int nWidth,
- int nHeight,BYTE pLutR[256],BYTE pLutG[256],
- BYTE pLutB[256])
- 参 数:
- BYTE *pDest; 指向目标图像数据区,RGB24格式。
- BYTE *pSrce; 指向源图像数据区,Bayer格式。
- int nWidth; 图像宽度。
- int nHeight; 图像高度。
- HV_BAYER_CONVERT_TYPE cvType; 插值算法类型。
- BYTE pLutR[256]; 红色分量查找表。
- BYTE pLutG[256]; 绿色分量查找表。
- BYTE pLutB[256]; 蓝色分量查找表。
- 返回值:无。
- 说 明:将源缓冲区的Bayer格式图像数据进行数据格式转换并传递到目标缓冲区
- 中。源缓冲区的图像为8位通道的Bayer格式数据,转换后存储在目标缓冲区的数据为
- RGB24位格式。
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <unistd.h>
- #include <sys/mman.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <sys/ioctl.h>
- #include <string.h>
- #include <sys/select.h>
- #define u8 uint8_t
- #define u16 uint16_t
- #define u32 uint32_t
- static uint8_t rgb[640*480*3];
- #define R(x,y) pRGB24[0 + 3 * ((x) + 640 * (y))]
- #define G(x,y) pRGB24[1 + 3 * ((x) + 640 * (y))]
- #define B(x,y) pRGB24[2 + 3 * ((x) + 640 * (y))]
- #define Bay(x,y) pBay[(x) + 640 * (y)]
- static void bayer_copy(u8 *pBay, u8 *pRGB24, int x, int y)
- {
- G(x + 0, y + 0) = Bay(x + 0, y + 0);
- G(x + 1, y + 1) = Bay(x + 1, y + 1);
- G(x + 0, y + 1) = G(x + 1, y + 0) = ((u32)Bay(x + 0, y + 0) + (u32)Bay(x + 1, y + 1)) / 2;
- 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);
- 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);
- }
- static void bayer_bilinear(u8 *pBay, u8 *pRGB24, int x, int y)
- {
- R(x + 0, y + 0) = ((u32)Bay(x + 0, y + 1) + (u32)Bay(x + 0, y - 1)) / 2;
- G(x + 0, y + 0) = Bay(x + 0, y + 0);
- B(x + 0, y + 0) = ((u32)Bay(x - 1, y + 0) + (u32)Bay(x + 1, y + 0)) / 2;
- R(x + 0, y + 1) = Bay(x + 0, y + 1);
- G(x + 0, y + 1) = ((u32)Bay(x + 0, y + 0) + (u32)Bay(x + 0, y + 2)
- + (u32)Bay(x - 1, y + 1) + (u32)Bay(x + 1, y + 1)) / 4;
- B(x + 0, y + 1) = ((u32)Bay(x + 1, y + 0) + (u32)Bay(x - 1, y + 0)
- + (u32)Bay(x + 1, y + 2) + (u32)Bay(x - 1, y + 2)) / 4;
- R(x + 1, y + 0) = ((u32)Bay(x + 0, y + 1) + (u32)Bay(x + 2, y + 1)
- + (u32)Bay(x + 0, y - 1) + (u32)Bay(x + 2, y - 1)) / 4;
- G(x + 1, y + 0) = ((u32)Bay(x + 0, y + 0) + (u32)Bay(x + 2, y + 0)
- + (u32)Bay(x + 1, y - 1) + (u32)Bay(x + 1, y + 1)) / 4;
- B(x + 1, y + 0) = Bay(x + 1, y + 0);
- R(x + 1, y + 1) = ((u32)Bay(x + 0, y + 1) + (u32)Bay(x + 2, y + 1)) / 2;
- G(x + 1, y + 1) = Bay(x + 1, y + 1);
- B(x + 1, y + 1) = ((u32)Bay(x + 1, y + 0) + (u32)Bay(x + 1, y + 2)) / 2;
- }
- static void bayer_to_rgb24(u8 *pBay, u8 *pRGB24)
- {
- int i, j;
- for (i = 0; i < 640; i += 2)
- for (j = 0; j < 480; j += 2)
- if (i == 0 || j == 0 || i == 640 - 2 || j == 480 - 2)
- bayer_copy(pBay, pRGB24, i, j);
- else
- bayer_bilinear(pBay, pRGB24, i, j);
- }
- void writepnm(uint8_t *data, int i)
- {
- FILE *fd;
- char name[32];
- sprintf(name, "p5-%04d.pnm", i);
- fd = fopen(name, "w");
- fputs("P6n", fd);
- fputs("640 480n", fd);
- fputs("255n", fd);
- fwrite(data, 640*480*3, 1, fd);
- fclose(fd);
- }
- int main(void)
- {
- int fdi;
- u8 *ibot;
- if ((fdi = open("bayer.raw", O_RDONLY)) < 0) {
- perror("open");
- return -1;
- }
- if ((ibot = mmap(NULL, 640 * 480 + 640*4, PROT_READ, MAP_SHARED, fdi, 0)) == MAP_FAILED) {
- perror("mmap");
- return -1;
- }
- bayer_to_rgb24(ibot, rgb);
- writepnm(rgb, 0);
- close(fdi);
- return 0;
- }