H1555

这个分好段就行,


#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<stack>
#include<math.h>
#include<string>
#include<stdlib.h>
#include<list>
#include<vector>
#include<map>

using namespace std;


int main()
{
    int k;
    int n;
    while (cin>>n)
    {
        if (n==1)
        {
            puts("Stan wins.");
            continue;
        }
        k=0;
        while (n>1)
        {
            k++;
            if (k&1)
            {
                n=(n+8)/9;
            }
            else
            {
                n=(n+1)/2;
            }

        }
        if (k&1)
            puts("Stan wins.");
        else
            puts("Ollie wins.");
    }

}


### 实现 YUV420SP 到 RGB_1555 的转换 YUV420SP(也称为 NV12)是一种常见的 YUV 格式,其中 Y 分量以平面形式存储,而 U 和 V 分量交错存储在一个单独的平面中。RGB_1555 是一种 16 位颜色格式,每个像素使用 16 位表示,其中红色占 5 位、绿色占 5 位、蓝色占 5 位,剩下的一位通常用于 alpha 通道或保留。 #### 转换步骤 1. **解析 YUV420SP 数据**: - YUV420SP 格式的存储方式为:首先存储完整的 Y 平面,接着存储 UV 平面,其中每个 UV 对应 2x2 的 Y 像素块。 - 假设图像分辨率为 `width x height`,则 Y 平面大小为 `width * height`,UV 平面大小为 `(width/2) * (height/2) * 2`(因为 U 和 V 交错存储)。 2. **YUV 到 RGB 的转换公式**: - 使用标准的 YUV 到 RGB 转换公式,并考虑量化范围(通常是 16-235 对于 Y,16-240 对于 UV)[^1]。 - 公式如下: $$ R = 1.164 \times (Y - 16) + 1.596 \times (V - 128) $$ $$ G = 1.164 \times (Y - 16) - 0.813 \times (V - 128) - 0.391 \times (U - 128) $$ $$ B = 1.164 \times (Y - 16) + 2.018 \times (U - 128) $$ 3. **将浮点结果转换为 16 位 RGB_1555 格式**: - 将计算得到的 R、G、B 值限制在 0-31 范围内(因为每个通道使用 5 位表示),然后组合成 16 位值。 - RGB_1555 的结构为 `A:R:G:B`,其中 A 位可以设置为 1 或 0。 4. **处理降采样问题**: - 在 YUV420SP 中,UV 分量是每 2x2 的 Y 像素共享一组 UV 值,因此在转换时需要重复使用相同的 UV 值来计算 2x2 区域内的所有像素。 #### 示例代码 ```c #include <stdint.h> #include <math.h> void yuv420sp_to_rgb1555(uint8_t* y_data, uint8_t* uv_data, uint16_t* rgb_data, int width, int height) { int y_index = 0; int uv_index = 0; int rgb_index = 0; for (int y = 0; y < height; y += 2) { for (int x = 0; x < width; x += 2) { // 获取当前块的 YUV 值 uint8_t y0 = y_data[y * width + x]; uint8_t y1 = y_data[(y * width) + x + 1]; uint8_t y2 = y_data[((y + 1) * width) + x]; uint8_t y3 = y_data[((y + 1) * width) + x + 1]; uint8_t u = uv_data[uv_index++]; uint8_t v = uv_data[uv_index++]; // 计算每个像素的 RGB 值 float fy0 = y0 - 16; float fy1 = y1 - 16; float fy2 = y2 - 16; float fy3 = y3 - 16; float fu = u - 128; float fv = v - 128; // 计算 R, G, B 值 float r0 = 1.164 * fy0 + 1.596 * fv; float g0 = 1.164 * fy0 - 0.813 * fv - 0.391 * fu; float b0 = 1.164 * fy0 + 2.018 * fu; float r1 = 1.164 * fy1 + 1.596 * fv; float g1 = 1.164 * fy1 - 0.813 * fv - 0.391 * fu; float b1 = 1.164 * fy1 + 2.018 * fu; float r2 = 1.164 * fy2 + 1.596 * fv; float g2 = 1.164 * fy2 - 0.813 * fv - 0.391 * fu; float b2 = 1.164 * fy2 + 2.018 * fu; float r3 = 1.164 * fy3 + 1.596 * fv; float g3 = 1.164 * fy3 - 0.813 * fv - 0.391 * fu; float b3 = 1.164 * fy3 + 2.018 * fu; // 限制 R, G, B 在 0-31 范围内 r0 = fmin(fmax(r0, 0), 31); g0 = fmin(fmax(g0, 0), 31); b0 = fmin(fmax(b0, 0), 31); r1 = fmin(fmax(r1, 0), 31); g1 = fmin(fmax(g1, 0), 31); b1 = fmin(fmax(b1, 0), 31); r2 = fmin(fmax(r2, 0), 31); g2 = fmin(fmax(g2, 0), 31); b2 = fmin(fmax(b2, 0), 31); r3 = fmin(fmax(r3, 0), 31); g3 = fmin(fmax(g3, 0), 31); b3 = fmin(fmax(b3, 0), 31); // 组合成 RGB_1555 格式 rgb_data[rgb_index++] = ((uint16_t)r0 << 10) | ((uint16_t)g0 << 5) | (uint16_t)b0; rgb_data[rgb_index++] = ((uint16_t)r1 << 10) | ((uint16_t)g1 << 5) | (uint16_t)b1; rgb_data[rgb_index++] = ((uint16_t)r2 << 10) | ((uint16_t)g2 << 5) | (uint16_t)b2; rgb_data[rgb_index++] = ((uint16_t)r3 << 10) | ((uint16_t)g3 << 5) | (uint16_t)b3; } } } ``` ### 相关问题 1. 如何优化 YUV 到 RGB 的转换过程? 2. RGB_1555 格式与 RGB_565 格式有什么区别? 3. 在嵌入式系统中如何高效实现 YUV 到 RGB 的转换? 4. 如何验证 YUV 到 RGB 转换的准确性? 5. 是否有现成的库可以实现 YUV 到 RGB 的转换?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值