前几天手里的智能锁项目 , 收到产品的建议(命令)说 , 就是人脸识别成功的时候 , 不要只显示摄像头捕捉到的图像 , 要弄个酷炫一点的背景, 背景里图片中间有个圆圈, 人脸就放到圆圈里也就是类似这样。。
当然, 这是我思考了好几个小时的结果, 开始想不明白要怎么实现,其实想通了也很简单, 三个步骤
A 把背景图像的RGB读出来 out_buf
B 把摄像头采集到的图像读出来(分辨率和背景图像一样) , in_buf
C 如果out_buf当前像素点是黑色不变, 否则填充in_buf到out_buf
有了思路了 , 就要付诸行动 , 花了好几个小时来了解了一下PNG图片的格式 , 又找到一个资料比较全的库 , 就各种找资料 , 把png的读写跑了一遍 , 特意记录一下
关于PNG文件格式这里不讨论 , 有兴趣的朋友直接百度"PNG文件格式"会得到自己想要的答案
一: 安装PNG库文件
因为PNG文件需要用到zlib进行编解码, 所以用到libpng的同时也需要zlib加密解密
本文使用的是libpng版本和zlib版本如下:
下载地址:
https://sourceforge.net/projects/libpng/files/
下载完之后如下命令顺序执行:
libpng:
#解压
tar -xzvf libpng-1.6.26.tar.gz && cd libpng-1.6.26
#安装
./configure
make check
sudo make install
sudo ldconfig
zlib:
#解压:
tar -xf zlib-1.2.11.tar.xz && cd zlib-1.2.11
#安装
./configure
sudo make install
sudo make
安装成功如下图 :
运行pkg-config libpng16 zlib --libs --cflags得到正确的头文件和链接库的位置
二 : 使用libpng
libpng有一套自己的流程如下:
1:初始化png_structp结构体 (用于和打开的文件指针绑定)
2:初始化png_infop结构体 (此结构体包含各种图片信息)
3:设置错误返回点 (如果是Libpng内部出现错误, 则会跳到你设置的错误返回点处执行)
4:绑定文件IO流到png_structp结构体 (打开的文件和png_structp结构体实例进行绑定)
5:写入需要生成PNG图像的信息, 信息内容包括尺寸, 位深度,颜色类型,是否交错, 换行等等,按照格式逐个填写就行了
6:写入实际的RGB数据到绑定好的png_structp结构体
7:写入文件尾部信息
8:清理工作 (释放申请的内存, 注销png_structp结构体)
代码如下 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <png.h>
#de