chartgpt解读yuv420p

chartgpt解读yuv420p_第1张图片
chartgpt解读yuv420p_第2张图片
chartgpt解读yuv420p_第3张图片
chartgpt解读yuv420p_第4张图片

从yuv420p文件中分别读出Y,U,V三个分量,并保存在3个二维数组中,然后对指定的像素点的Y,U,V三个分量赋值,是该点变成黑色


#include 
#include 
#include 

// 定义图像分辨率
#define WIDTH 3000
#define HEIGHT 3000

int main()
{
    FILE *fin, *fout;
    int32_t x, y;

    // 加载 YUV 文件
    fin = fopen("test.yuv", "rb");
    if (fin == NULL) {
        fprintf(stderr, "Failed to open input file.\n");
        return -1;
    }

    // 读取所有像素数据,以及 U/V 分量数据
    // y_data 是一个指向 uint8_t [WIDTH] 类型数组的指针变量,sizeof(*y_data)的大小为sizeof(uint8_t [WIDTH])
    // 即申请的堆空间大小为malloc(HEIGHT * sizeof(uint8_t) * WIDTH) = malloc(HEIGHT * WIDTH)
    uint8_t (*y_data)[WIDTH] = malloc(HEIGHT * sizeof(*y_data)); //存储y分量,y_data指向uint8_t [WIDTH]
    uint8_t (*u_data)[WIDTH/2] = malloc(HEIGHT/2 * sizeof(*u_data)); //存储u分量
    uint8_t (*v_data)[WIDTH/2] = malloc(HEIGHT/2 * sizeof(*v_data)); //存储v分量

    //yuv420p:YYYYYYYYYYUUUUUVVVVV,分开保存Y,U,V三个分量
    fread(y_data, sizeof(uint8_t), HEIGHT * WIDTH, fin); //从yuv文件中读出Y
    fread(u_data, sizeof(uint8_t), HEIGHT/2 * WIDTH/2, fin); //从yuv文件中读出U
    fread(v_data, sizeof(uint8_t), HEIGHT/2 * WIDTH/2, fin); //从yuv文件中读出V

    fclose(fin);

    // 读取包含坐标点信息的文件
    fin = fopen("output2.txt", "r");
    if (fin == NULL) {
        fprintf(stderr, "Failed to open coordinate file.\n");
        return -1;
    }

    // 将指定像素点的 Y、U、V 值设置为指定值
    while (fscanf(fin, "(%d,%d)\n", &x, &y) == 2) {
        if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT) {
            continue;  // 跳过越界点
        }
        y_data[y][x] = 17;
        u_data[y/2][x/2] = 128;
        v_data[y/2][x/2] = 128;
    }

    fclose(fin);

    // 将修改后的像素数据写回到 YUV 文件中
    fout = fopen("output.yuv", "wb");
    if (fout == NULL) {
        fprintf(stderr, "Failed to open output file.\n");
        return -1;
    }

    fwrite(y_data, sizeof(uint8_t), HEIGHT * WIDTH, fout);
    fwrite(u_data, sizeof(uint8_t), HEIGHT/2 * WIDTH/2, fout);
    fwrite(v_data, sizeof(uint8_t), HEIGHT/2 * WIDTH/2, fout);

    fclose(fout);

    // 释放动态申请的内存
    free(y_data);
    free(u_data);
    free(v_data);

    return 0;
}

~

你可能感兴趣的:(机器视觉,linux)