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

举报
ReCclay 发表于 2022/02/22 01:23:51 2022/02/22
【摘要】 摄像头 采集回来的图像是,压缩图像,需要进行解压, 鹰眼图像解压,转为 二维数组。 (其实就是原来一个字节存8个像素点,现在解压把它膨胀成1个字节1个像素点。) 一维数组和二维数组,在内存存储上都是...

摄像头 采集回来的图像是,压缩图像,需要进行解压, 鹰眼图像解压,转为 二维数组。
(其实就是原来一个字节存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 。

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/79525280

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。