飞卡日常进度之鹰眼图像解压,转为二维数组

摄像头 采集回来的图像是,压缩图像,需要进行解压, 鹰眼图像解压,转为 二维数组。
(其实就是原来一个字节存8个像素点,现在解压把它膨胀成1个字节1个像素点。)


一维数组和二维数组,在内存存储上都是一样的!!!

图像的存储图:(分辨率60*80)(每行采集80个像素点,共60行,即4800个像素点)(0在左上角,是远方左端)

这里写图片描述

假设 采集回来的图像地址是: img_bin_buff (鹰眼是 8个像素一个字节

想解压到: uint8 img_buf[H][W]; 这个 二维数组里。(当然也可以是一维数组: uint8 img_buf[H*W]; )则需要调用这个函数:

img_extract((uint8 *)img_buf,(uint8 *) img_bin_buff, H*W/8);        
//解压为灰度图像,方便发送到上位机显

img_buf定义成二维数值时,与一维数组不同的是,这里的 img_buf 传递进去的时候多了强制类型转换 (uint8 *)
原理其实也很简单,理解了C语言的数组和指针的关系,这里也就不难理解!举个例子,一维数组a[]和指针的a*是一样的,同样二维数组的a[][]和指针的a**是一样的。

那么对应上面的强制转换也就不难理解了,可以猜到img_extract()函数的参数也肯定是uint8类型的。看一下这个函数的实现:

//压缩二值化图像解压(空间 换 时间 解压)
//srclen 是二值化图像的占用空间大小
void img_extract(uint8 *dst, uint8 *src, uint32 srclen)
{
        uint8 colour[2] = {255, 0};   //0 和 1 分别对应的颜色
                                               //注:山外的摄像头 0 表示 白色,1表示 黑色
        uint8 tmpsrc;
        while(srclen --)
        {
                tmpsrc = *src++;
                *dst++ = colour[ (tmpsrc >> 7 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 6 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 5 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 4 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 3 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 2 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 1 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 0 ) & 0x01 ];
         }
}

所以总结一下两种用法,分别对应二维数组一维数组

二维数组的方法:

uint8 img_buf[H][W];   //二维数组
img_extract((u8 *)img_buf,(uint8 *) img_bin_buff, H*W/8);  
//解压为灰度图像,方便发送到上位机显

一维数组的方法:(例程默认是这样)

uint8 img_buf[H*W];   //一维数组
img_extract(img_buf,(u8 *) img_bin_buff, H*W/8);        
//解压为灰度图像,方便发送到上位机显

关于解压数组:

uint8 colour[2] = {255, 0};   //0 和 1 分别对应的颜色
//注:山外的摄像头 原始输出数据 0 表示 白色,1表示 黑色,解压后的数据由此数组的值决定

再补充说明:

一、解压前和解压后的对应关系

解压前,0 表示 白色,1表示 黑色;
解压后,由这个数组来定。上述的代码是:

        colour[0]=255 ,即白色
        colour[1]=0    ,即黑色

换句话说,上面的解压代码**,解压后,0表示黑色,255表示白色。** (之所以设置,是为了方便灰度显示)

二、解压某几行

假如需要解压指定的行,方法也是类似,也是用 img_extract 函数,但不是全部解压,而是仅解压指定的行。

①、假如需要解压 第 3行 (从第一行数起),图像本身 60行,80列
就压缩后的图像而言,一行 共 80/8 =10 个字节。第 3 行,在压缩图像数组的偏移就是 (3-1)*10

那么:
img_extract(buff , img_bin_buff+(3-1)*10, 10); 把第3行,共10个字节,解压到 buff 数组上

如果需要解压指定多行呢? 用数组来存储要指定第几行咯,然后用变量来代替上面的 3 。

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值