FPGA实现图像对比度自动调整,提供2套工程源码和技术支持
1.算法原理介绍
使用直方图均衡技术实现
使用直方图均衡技术将原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,是一种常用的图像增强方法。
处理过程如下:
首先,我们需要将RGB888图像转化为YCrCb,统计当前Y分量直方图分布(应用于下一帧),并通过上一帧的统计数据均衡化当前 Y 分量,再转换回RGB888并输出。
2.HLS算法实现
算法采用HLS实现,处理流程部分代码如下:
#pragma HLS dataflow
hls::AXIvideo2Mat(src_axi, img1);
Cvt_RGB_to_YCrCb(img1, img2);
dualAryEqualize<HLS_8UC3, HLS_8UC3, IMG_MAX_HEIGHT, IMG_MAX_WIDTH, 256>(img2, img3, adj);
Cvt_YCrCb_to_RGB(img3, img5);
hls::Mat2AXIvideo(img5, dst_axi);
需要完整HLS代码的兄弟可以看完文章后再最后的福利章节得到源码的获取渠道;
HLS综合后的延时和逻辑资源占用统计如下:
HLS综合编译后,即可到处RTL得到HLS的IP核,可在vivado中直接调用;
3.工程1介绍:zynq7100实现
开发板:zynq7100开发板;
开发环境:vivado2019.1;
输入:OV5640摄像头,输入分辨率1280X720;
输出:HDMI,输出分辨率1280X720;
工程BD如下:
代码架构如下:
SDK主函数代码如下:
#include "I2C_16bit.h"
#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "xcontrastadj.h"
#include "xil_cache.h"
XIicPs Iic;
XContrastadj contrastadjadjInstance;
void main(){
I2C_config_init();
XContrastadj_Initialize(&contrastadjadjInstance, XPAR_CONTRASTADJ_0_DEVICE_ID);
XContrastadj_EnableAutoRestart(&contrastadjadjInstance);
//XContrastadj_Set_adj(&contrastadjadjInstance, 50);
XContrastadj_Start(&contrastadjadjInstance);
helai_vdma();
while(1);
while(1){
for(int adj=0; adj<=100; adj++){
XContrastadj_Set_adj(&contrastadjadjInstance, adj);
usleep(100000);
}
}
}
可以在while(1)死循环里自动调整对比度;
也可以使用XContrastadj_Set_adj(&contrastadjadjInstance, 50)单独调整对比度,这里的入口参数 50即为自定义设置的对比度;
4.工程2介绍:Kintex7实现
开发板:Kintex7开发板;
开发环境:vivado2019.1;
输入:OV5640摄像头,输入分辨率1280X720;
输出:HDMI,输出分辨率1280X720;
工程BD如下:
代码架构如下:
SDK主函数代码如下:
#include <stdio.h>
#include "xgpio.h"
#include "oak_iic.h"
#include "unistd.h"
#include "helai_vdma.h"
#include "helai_color_back.h"
#include "xcontrastadj.h"
XGpio_Config *XGpioCfg;
XGpio led_gpio;
XContrastadj contrastadjadjInstance;
#define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID
int main(){
XGpioCfg = XGpio_LookupConfig(AXI_GPIO_DEVICE_ID);
XGpio_CfgInitialize(&led_gpio, XGpioCfg, XGpioCfg->BaseAddress);
XGpio_SetDataDirection(&led_gpio, 1, 0); //output
XGpio_DiscreteWrite(&led_gpio, 1, 0);
oak_i2c_init(OV5640_IIC_BASEADDR, 1000000, 0x78>>1, IIC_REG_LEN16, IIC_DATA_LEN8);
OV5640_Init(OV5640_IIC_BASEADDR,1280,720);
XContrastadj_Initialize(&contrastadjadjInstance, XPAR_CONTRASTADJ_0_DEVICE_ID);
XContrastadj_EnableAutoRestart(&contrastadjadjInstance);
XContrastadj_Set_adj(&contrastadjadjInstance, 100);
XContrastadj_Start(&contrastadjadjInstance);
helai_vdma();
while(1){
usleep(500000);
XGpio_DiscreteWrite(&led_gpio, 1, 1);
usleep(500000);
XGpio_DiscreteWrite(&led_gpio, 1, 0);
}
}
5.上板调试验证
工程1开发板连接如下:
工程2开发板连接如下:
下面给出不同对比度的输出效果:
设置对比度为0时的输出效果如下:
可以看到画面除白色衣区域外其他部分较暗;
设置对比度为50时的输出效果如下:
可以看到画面整体变得更亮,白色衣服更白,左边的书籍堆放区也亮了很多;
设置对比度为100时的输出效果如下:
可以看到图像更加敞亮,甚至有点刺眼了。。。
6.福利:工程源码获取
福利:工程代码的获取
代码太大,无法邮箱发送,以百度网盘链接方式发送,
通过微信获取资料:
资料如下: