0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于彩色MT9V034摄像头 Bayer转RGB FPGA实现

FPGA之家 来源:宏强子 作者:宏强子 2021-06-12 17:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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号要需要查看摄像头模块PCB上的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),不会的朋友可以搜一搜,有很多博客可以学习,一定要自己仿真一下,搞明白,这原理有点难理解。

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

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

1)第一种{行偶,列偶}

2)第二种{行偶,列奇}

3)第三种{行奇,列偶}

4)第四种{行奇,列奇}

5 算法实现

首先说明我是用Xilinx的ZYNQ FPGA,(Altera的也有类似的IP)。我直接说明一下IP的参数设置,其他的像怎么添加IP什么的我就不讲了,不会的自己网上学习。

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

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

a97d14c6-c55a-11eb-9e57-12bb97331649.png

3)verilog源码

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer: 宏强子

//

// Create Date: 2019/02/04 1056

// 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

6 总结

最后说明一下,最后分辨率改为640*480,但是发现480指的是0~480,所以行计数器在481清零。由于我使用的是ZYNQ,所以直接使用PS端的IIC接口配置摄像头。如果用默认的分辨率就需要修改一下IP的深度和行计数器的清零的数值就行了。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5619

    浏览量

    130395
  • 计数器
    +关注

    关注

    32

    文章

    2321

    浏览量

    98537
  • IIC
    IIC
    +关注

    关注

    11

    文章

    311

    浏览量

    40762

原文标题:彩色MT9V034摄像头 Bayer转RGB FPGA实现

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    摄像头可靠性EMC设计优化

    一前言摄像头作为现代电子设备的重要组成部分,已广泛应用于智能手机、安防监控、自动驾驶等领域。详细了解摄像头,不仅有助于我们更好地使用相关设备,也为后续探讨其应用场景和技术优化奠定了基础,并且能快速
    的头像 发表于 04-07 11:34 140次阅读
    <b class='flag-5'>摄像头</b>可靠性EMC设计优化

    【正点原子STM32N647开发板试用】--MCMX335摄像头实验

    之前体验的RGB屏幕的功能,这回为了体验一下摄像头的功能,特意去TB买了原子配套的MCIMX335摄像头,该摄像头采用的是MIPI接口。 电路图上是接口电路,器件号是J2,如下图 不
    发表于 02-21 17:45

    ESP32-S3在初始化摄像头时检测到摄像头模组型号不被支持

    (WROOM-32)不同,接错引脚会直接导致探测失败!以下是OV2640/OV5640与ESP32-S3的标准接线表(兼容大部分开发板): 摄像头引脚 ESP32-S3引脚 功能说明 VCC 3.3V 供电(必须
    发表于 02-11 06:38

    【正点原子STM32N647开发板试用】--摄像头屏显

    本篇讲述实现摄像头画面LCD屏幕显示,即显示屏与摄像头功能整合在一起。 一.硬件原理与准备 1.LCD触摸显示屏 开发板配备有一块4.3寸RGB LCD触摸(电容)显示屏,分辨率480
    发表于 01-25 14:51

    自动驾驶既然有双目摄像头了,为什么还要三目摄像头

    [首发于智驾最前沿微信公众号]在自动驾驶领域,纯视觉方案一直受到不少人的认可。双目摄像头由于模拟了人眼的工作方式,能够通过视差计算还原三维信息,在距离判断和空间感知上具有天然优势,因此被广泛应用于纯
    的头像 发表于 12-09 08:59 1247次阅读
    自动驾驶既然有双目<b class='flag-5'>摄像头</b>了,为什么还要三目<b class='flag-5'>摄像头</b>?

    实战指南:用摄像头模块实现多场景智能拍摄全流程!

    想通过摄像头模块实现多场景智能拍摄?本指南为你提供全流程实战指引。从前期准备、模块集成,到多场景拍摄测试与优化,每一步都结合实际操作细节展开,让你清晰掌握摄像头模块在不同场景(如安防监控、工业检测
    的头像 发表于 11-21 17:59 424次阅读
    实战指南:用<b class='flag-5'>摄像头</b>模块<b class='flag-5'>实现</b>多场景智能拍摄全流程!

    3.7V升12V0.5A摄像头供电芯片H6392

    ,保障拍摄过程中电源输出无波动。 芯片内置18V/0.2Ω 功率 MOSFET,其 PWM 控制电路可提升电源系统效率,满足摄像头工作时的功耗优化需求;内部补偿网络能优化外部最多 9 个组件,有效精简
    发表于 11-13 16:02

    车载双目摄像头如何“看见”世界?

    [首发于智驾最前沿微信公众号]想要让车辆知道前方有什么、距离多远、是否可以靠近,首先要做的是让其“看”清楚环境。在众多车载感知硬件中,与人类看到世界最类似的一个感知硬件便是车载双目摄像头了。 图片
    的头像 发表于 11-13 09:17 1663次阅读
    车载双目<b class='flag-5'>摄像头</b>如何“看见”世界?

    索尼4K超高清摄像头模块——FCB-ER8530

    摄像头
    szxuanzhan
    发布于 :2025年08月13日 17:12:43

    Texas Instruments TPS650332-Q1汽车摄像头PMIC特性及应用电路

    Texas Instruments TPS650332-Q1汽车摄像头电源管理IC(PMIC)包含一个低压差(LDO)稳压器和三个降压转换器。降压1降压转换器的输入电压范围高达18.3 V,用于
    的头像 发表于 08-06 09:20 1349次阅读
    Texas Instruments TPS650332-Q1汽车<b class='flag-5'>摄像头</b>PMIC特性及应用电路

    创世SD NAND贴片卡:智能摄像头存储难题的完美解决方案 #人工智能 #智能摄像头 #摄像头

    摄像头
    深圳市雷龙发展有限公司
    发布于 :2025年08月05日 11:17:13

    红外摄像头模组是什么?科技时代的眼睛

    在现代科技迅速发展的背景下,红外摄像头模组逐渐成为各类智能设备中的重要组成部分。无论是在安防监控、智能家居还是汽车领域,红外摄像头模组以其独特的功能和优越的性能,正在改变我们的生活方式。本文将
    的头像 发表于 07-31 10:07 1305次阅读
    红外<b class='flag-5'>摄像头</b>模组是什么?科技时代的眼睛

    【Milk-V Duo S 开发板免费体验】4 - OV5647 摄像头摄像头测试

    引言 以前使用Milk-V Duo的时候,觉得它的摄像头支持比较弱,只能支持特定型号的摄像头,还不好买。我有个学生甚至因为这个原因退出了集创赛。这次特意测试了一下它的摄像头。 DuoS
    发表于 07-08 21:26

    庐山派K230可以直接使用usb摄像头吗,可以的话摄像头有啥要求吗?

    庐山派K230可以直接使用usb摄像头吗,可以的话摄像头有啥要求吗
    发表于 06-24 07:07

    K230micropython下能实现同时用USB摄像头和板载摄像头YOLO识别并显示在IDE上吗?

    K230micropython下能实现同时用USB摄像头和板载摄像头YOLO识别并显示在IDE上吗?以及如何提高USB进行YOLO识别的帧数?
    发表于 06-20 06:35