彩色MT9V034摄像头 Bayer转rgb 去马赛克(demosiac) FPGA实现

彩色MT9V034摄像头 Bayer转rgb FPGA实现

1 图像bayer格式介绍

  bayer格式是伊士曼·柯达公司科学家Bryce Bayer发明的,Bryce Bayer所发明的拜耳阵列被广泛运用数字图像。Bayer格式是相机内部的原始数据, 一般后缀名为.raw。

  对于彩色图像,一般是三原色数据,rgb格式。但是摄像头一个像素点只有rgb中一种数据(下图为bayer色彩滤波阵列)。但是有很多摄像头直接输出rgb和yuv格式,如ov5640、ov7725等等,这是因为在Sensor模组的内部会有一个ISP模块,会将 Sensor采集到的数据进行插值和特效处理,所以直接输出彩色图像但也有摄像头没有ISP模块,直接输出Bayer数据,这就需要自己写Bayer转rgb算法。

2 MT9V034简单介绍

   做图像处理的朋友都知道,MT9V034是一款十分出色的做机器视觉的摄像头,一般都是灰度的。但是也有彩色款,当时我觉得灰度的效果那么好,一时头热就买一个彩色款的。mt9v034用起来很方便,可以不用寄存器配置,上电默认752*480分辨率。当然也可以iic配置。

  全局快门(相对滚动快门) 拍摄高速物体的效果:

  高动态效果:

3 MT9V034 datasheet 简单解析

  1)有效图像 752x480

    最大时钟为27Mhz

    最大帧率为60fps

    10位的adc(我的是八位的输出,店家只将高8位引出,有点影响最后图像的精度)

   2)这是mt9v034Bayer阵列,注意输出方向,从左到右,从上到下。

   3)摄像头ID号要根据 S_CTRL_ADR1, S_CTRL_ADR0这两个引脚咋连接的

  4)下图是摄像头原理图,很明显S_CTRL_ADR1, S_CTRL_ADR0是被拉低了,所以摄像头ID为0x90.上面说到摄像头只有高8位被引出,在这里可以证实了。

  5)下面是大部分寄存器,mt9v034可配置的寄存器很少。0x00是芯片版本。03、04是摄像头分辨率

 

  6)datasheet就介绍到这里,更多信息可以自己去阅读。

 4 Bayer转rgb算法解析

我是用shift register ip 缓存两行数据,形成2*2窗口(这是FPGA做图像算法最常用的方法和ip),不是很会的朋友可以百度搜一搜,有很多博客可以学习,一定要自己仿真一下,搞明白,这有点难理解。

根据窗口移动,不难发现,总结出一条重要的规律:总共只有四种窗口,而且与行和列的奇偶有关。

假设计数器从零开始记数:

第一种{行偶,列偶}

 第二种{行偶,列奇}

 第三种{行奇,列偶}

第四种{行奇,列奇}

5 算法实现

首先说明我是用xilinx的zynq fpga,altera的也有类似的ip。我直接说明一下ip 参数修改,其他的怎么添加ip什么的我就不讲了,不会的自己百度学习。

  1)这是ip首页,蓝框自定义ip名,修改一下红框的参数,我们是8位数据,一行数据为640个。clock enable端与sclr端可以根据自己的要求决定勾不勾选。其他默认就行,点击ok可以了。

   2)vivado也提供端口例化模板,如下图操作就行,

 

  3)源码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 宏强子
// 
// Create Date: 2019/02/04 10:29:56
// Design Name: colour MT98V034 bayer2rgb
// Module Name: MT_bayer2rgb
// Project Name: Colour_MT_bayer2rgb
// Target Devices: ZYNQ7020
// Tool Versions: vivado2018.3
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module MT_bayer2rgb(
	//system singal
	input						s_rst_n			,
	//cmos simgals
	input						vsync_i			,
	input						hsync_i			,
	input						pclk			,
	input			[7:0]		     bayer_data		,
	//输出
	output						vsync_o			,
	output						hsync_o			,
	output			[23:0]		     rgb_data		
    );

//========================================================================\
// =========== Define Parameter and Internal signals =========== 
//========================================================================/

reg 			[9:0]		col_cnt			;
reg 			[8:0]		row_cnt			;

reg 					hsync_i_1		;
reg 					hsync_i_2		;


reg 					vsync_i_1		;
reg 					vsync_i_2		;

wire 			[7:0]		line_1			;
wire 			[7:0]		line_2			;
reg			[2:0]		data_control	     ;

reg 			[7:0]		line1_1			;	
reg 			[7:0]		line1_2			;	

reg 			[7:0]		line2_1			;	
reg 			[7:0]		line2_2			;	


reg 			[7:0]		rgb_r			;
reg 			[8:0]		rgb_g			;
reg 			[7:0]		rgb_b			;
//=============================================================================
//****************************     Main Code    *******************************
//=============================================================================

//列计数
always @ (posedge pclk or negedge s_rst_n) begin
	if(s_rst_n == 1'b0)
		col_cnt <= 10'd0;
	else if (hsync_i == 1'b1)
		col_cnt <= col_cnt + 1'b1;	
	else	
        col_cnt <= 10'd0;
end

always @ (posedge pclk) begin 
		hsync_i_1 <= hsync_i;
		hsync_i_2 <= hsync_i_1;
end


always @ (posedge pclk) begin 
		vsync_i_1 <= vsync_i;
		vsync_i_2 <= vsync_i_1;
end

//行计数
always @ (posedge pclk or negedge s_rst_n) begin
	if(s_rst_n == 1'b0)
		row_cnt <= 9'd0;
	else if(~hsync_i && hsync_i_1)
		row_cnt <= row_cnt + 1'b1;
	else if (row_cnt >= 9'd481)
		row_cnt <= 9'd0;     
end


//data_control
always @ (posedge pclk or negedge s_rst_n) begin
	if(s_rst_n == 1'b0)
		data_control <= 3'b100;
	else if (hsync_i_1 == 1'b1 && hsync_i == 1'b1)
		data_control <= {1'b0,row_cnt[0],~col_cnt[0]};
	else
		data_control <= 3'b100;	   
end

shift_ram		shift_ram_1 (
  .D 			(bayer_data 	     ),    	// input wire [7 : 0] D
  .CLK 			(pclk			),  	// input wire CLK
  .CE 			(hsync_i 		),   	// input wire CE
  .SCLR			(~s_rst_n		),  	// input wire SCLR
  .Q 			(line_1			)     	// output wire [7 : 0] Q
);

shift_ram		shift_ram_2 (
  .D 			(line_1			),    	// input wire [7 : 0] D
  .CLK 			(pclk			),  	// input wire CLK
  .CE 			(hsync_i 		),   	// input wire CE
  .SCLR			(~s_rst_n		),  	// input wire SCLR
  .Q 			(line_2			)     	// output wire [7 : 0] Q
);


always @ (posedge pclk or negedge s_rst_n) begin
	if(s_rst_n == 1'b0) begin
		line1_1	<= 8'd0;
		line1_2	<= 8'd0;

		line2_1 <= 8'd0;
		line2_2 <= 8'd0;
	end
	else begin
		line1_1	<= line_1;
		line1_2	<= line1_1;

		line2_1	<= line_2;
		line2_2	<= line2_1;
	end	
        
end


always @ (data_control) begin
       case(data_control)
       	3'b000 : begin 
       		rgb_r = line1_1 + 8'd5; 
       		rgb_g = line2_1 + line1_2 + 8'd10; 
       		rgb_b = line2_2 + 8'd5;
       	end
       	3'b001 : begin
       		rgb_r = line1_2 + 8'd5;
       		rgb_g = line1_1 + line2_2 + 8'd10; 
       		rgb_b = line2_1 + 8'd5;
       	end
       	3'b010 : begin
       		rgb_r = line2_1 + 8'd5;
       		rgb_g = line1_1 + line2_2 + 8'd10;
       		rgb_b = line1_2 + 8'd5;
       	end
       	3'b011 : begin
       		rgb_r = line2_2 + 8'd5;
       		rgb_g = line2_1 + line1_2 + 8'd10;
       		rgb_b = line1_1 + 8'd5;
       	end
       	default: begin 
       		rgb_r = 8'd0;
       		rgb_g = 9'd0;
       		rgb_b = 8'd0; 
       	end
       	endcase
end

assign rgb_data =  {rgb_r,rgb_g[8:1],rgb_b};
assign vsync_o 	= vsync_i_2;
assign hsync_o 	= hsync_i_2;
endmodule

  4)最后欣赏一下效果 ,效果还不错,继承了灰度款的优良性能。

最后说明一下,最后分辨率改为640*480,但是发现480指的是0~480,所以行计数器在481清零。我是用的zynq,所以没进行iic硬件配置,用的是ps端arm的 iic接口做的。如果用默认的分辨率就需要修改一下ip的深度和行计数器的清零的数值就行了。说到仿真,vivado自带的仿真器还是没有modelsim好,但是modelsim仿真含有vivado ip的工程时,很麻烦,独立仿真更不行,ip仿真的源文件不好添加,联合仿真操作有点繁琐,这里呢先不讲,我下次再另外写一篇博客总结一下。

欢迎关注我的公众号:芯王国,有更多的FPGA&数字IC的技术分享,还可以获取开源FPGA项目!

在这里插入图片描述

### 回答1: MT9V034是Micron Technology公司生产的一款2D数字图像传感器,常用于工业相机、机器视觉、车载摄像头等领域。该传感器采用了CMOS技术,具有较高的图像质量和性能。 MT9V034的主要技术特点包括:分辨率高达752x480像素,像素大小为6μm x 6μm,能够提供高精度和清晰的图像输出;具有行扫描功能,可在快速运动或高速拍摄情况下实现图像采集;采用了自动曝光补偿和自动白平衡技术,能够自动调整图像的亮度和色彩平衡,提供更真实的图像效果;支持多种数据输出格式,包括RAW、RGB和YUV等,可根据不同应用需求选择适合的数据格式。 同时,MT9V034还具有低功耗、高帧率和噪声过滤等特点,能够满足对高速图像处理和实时传输的要求。此外,该传感器支持I2C总线接口,方便与主控芯片进行通信和控制。 MT9V034提供了详细的技术参数和工作特性,用户可以根据手册中的说明进行操作和配置。手册中包含了传感器的引脚定义、电气特性、寄存器配置、时序图等详细信息,能够帮助用户全面了解和使用该传感器。 总之,MT9V034是一款性能稳定、功能丰富的2D数字图像传感器,适用于多种应用场景。通过阅读和理解其相关数据手册,用户可以更好地应用和发挥该传感器的优势,实现高质量的图像采集和处理。 ### 回答2: MT9V034是一种CMOS图像传感器,广泛应用于工业视觉、机器视觉、监控摄像等领域。该传感器由美信公司(ON Semiconductor)生产,并且在市场上得到了广泛的应用和认可。下面将从功能特点、技术规格和应用场景三个方面进行介绍。 首先,MT9V034具有较高的分辨率和灵敏度,支持最高752x480像素的图像采集。可以输出全彩色RGB图像,提供高质量的图像传输。同时,该传感器还具有低功耗和高帧率的特点,适用于高速动态图像采集的应用。 其次,MT9V034数据手册详细介绍了传感器的技术规格和性能参数。如传感器的电源电压范围、工作温度范围、图像传输接口等。还包括光学参数、帧率、ADC分辨率、动态范围、信噪比以及特殊功能等。通过查看数据手册,用户可以对传感器的技术要求有更深入的了解。 最后,MT9V034在工业视觉、机器视觉和监控摄像等领域具有广泛的应用。例如,在工业生产线上,可用于检测产品质量、测量尺寸等;在机器人领域,可用于导航和定位;在监控领域,可用于提供高清晰度的视频监控。其高分辨率、高帧率和广泛的兼容性使得MT9V034成为了许多应用场景的理想选择。 总之,MT9V034是一种性能优越的CMOS图像传感器,具有较高的分辨率、灵敏度、低功耗和高帧率等特点。通过查看数据手册,用户可以详细了解传感器的技术规格和性能参数。它在工业视觉、机器视觉和监控摄像等领域有广泛应用。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值