FPGA 第4章 摄像头Bayer转rgb

news2024/11/18 19:42:15

参考文献
彩色MT9V034摄像头 Bayer转rgb FPGA实现
https://www.cnblogs.com/hqz68/p/10413896.html

文章目录

  • 前言
  • Bayer转rgb
    • 算法解析
  • 总结


前言

Bayer格式是相机内部的原始数据, 一般后缀名为.raw。
在这里插入图片描述

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


Bayer转rgb

算法解析

mt9v034的Bayer阵列为例,注意输出方向,从右到左,从上到下。

在这里插入图片描述

可以用shift register ip 或者fifo缓存两行数据,形成2*2窗口。

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
        hsync_i_1 <= 1'b0;
        hsync_i_2 <= 1'b0;
        hsync_i_3 <= 1'b0;
    end
    else begin
        hsync_i_1 <= hsync_i;
        hsync_i_2 <= hsync_i_1;
        hsync_i_3 <= hsync_i_2;
    end
end


always @ (posedge pclk or negedge s_rst_n) begin 
     if(s_rst_n == 1'b0) begin
        vsync_i_1 <= 1'b0;
        vsync_i_2 <= 1'b0;
        vsync_i_3 <= 1'b0;
    end
    else begin
        vsync_i_1 <= vsync_i;
        vsync_i_2 <= vsync_i_1;
        vsync_i_3 <= vsync_i_2;
    end
end

列计数
always @ (negedge pclk or negedge s_rst_n) begin
    if(s_rst_n == 1'b0)
        col_cnt <= 10'd0;
    else if (hsync_i_3 == 1'b1 && hsync_i_2 == 1'b1)
        col_cnt <= col_cnt + 1'b1;    
    else    
        col_cnt <= 10'd0;
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 (~vsync_i && vsync_i_1)
        row_cnt <= 9'd0;     
end

由于在列计数col_cnt中使用了hsync_i_3 == 1’b1 && hsync_i_2 == 1’b1的作为开始计数条件,相当于向后延迟了3个PCLK,所以col_cnt[0]为0时候,其实列计数为奇数列。
当然,如果列计数col_cnt中直接使用hsync_i == 1’b1作为开始计数条件,则col_cnt[0]为0时候,列计数为偶数列。

//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_2 == 1'b1 && hsync_i_1 == 1'b1)
        data_control <= {1'b0,row_cnt[0],~col_cnt[0]};
    else
        data_control <= 3'b100;       
end

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

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

第一种{行偶,列偶}
在这里插入图片描述

第二种{行偶,列奇}
在这里插入图片描述

第三种{行奇,列偶}
在这里插入图片描述

第四种{行奇,列奇}
在这里插入图片描述


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; 
               rgb_g = line2_1 + line1_2; 
               rgb_b = line2_2;
           end
           3'b001 : begin
               rgb_r = line1_2;
               rgb_g = line1_1 + line2_2; 
               rgb_b = line2_1;
           end
           3'b010 : begin
               rgb_r = line2_1;
               rgb_g = line1_1 + line2_2;
               rgb_b = line1_2;
           end
           3'b011 : begin
               rgb_r = line2_2;
               rgb_g = line2_1 + line1_2;
               rgb_b = line1_1;
           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_3;
assign hsync_o     = hsync_i_3;

总结

本文根据mt9v034讲解Bayer转rgb的使用,不同摄像头有不同的Bayer的起始排列位置,需要根据手册撰写代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01.爬虫---初识网络爬虫

01.初识网络爬虫 1.什么是网络爬虫2.网络爬虫的类型3.网络爬虫的工作原理4.网络爬虫的应用场景5.网络爬虫的挑战与应对策略6.爬虫的合法性总结 1.什么是网络爬虫 网络爬虫&#xff0c;亦称网络蜘蛛或网络机器人&#xff0c;是一种能够自动地、系统地浏览和收集互联网上信息的程…

解决 SpringBoot 的 Date、LocalDateTime 变成时间戳和数组的问题,创建自定义对象消息转换器

问题描述 SpringBoot 项目&#xff0c;当返回前端的数据类型为 Map 的时候&#xff0c;在 Map 中 put() 时间对象会出现以下问题&#xff1a; 传递的 Date 对象会变成时间戳传递的 LocalDateTime 对象会变成数组 问题复现 编写一个 Controller 方法&#xff0c;返回值为 Ma…

网络安全基础技术扫盲篇 — 名词解释

网络模块基础&#xff08;网络拓扑图、网络设备、安全设备&#xff09; 用通俗易懂的话说&#xff1a; 网络拓扑图&#xff1a;它就像一张网络世界的地图&#xff0c;它展现了我们数不清的网站、服务器和设备是如何相互连接的。用简单的话说&#xff0c;它就是给我们指路、告…

企业ov代码签名证书1300

我们在下载一些软件代码时&#xff0c;有时候操作系统会出现未知软件拦截&#xff0c;各个杀毒软件也会因为软件身份不明拦截软件下载。而代码签名证书可以对软件进行数字签名&#xff0c;以验证软件的身份和完整性。这种数字签名机制确保了软件在传输和安装过程中没有被篡改或…

数据结构---优先级队列(堆)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 关注博主带你了解更多数据结构知识 1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&am…

Rust 赋能前端 -- 写一个 File 转 Img 的功能

所有耀眼的成绩,都需要苦熬,熬得过,出众;熬不过,出局 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas脚手架生成项…

win11缺少msvcr110dll,msvcp110.dll的解决办法

MSVCP110.dll是一个与Microsoft Visual C 2012 Redistributable Package相关的动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;主要用于支持使用C编写的Windows应用程序运行时所需的特定功能。当用户尝试运行依赖于这个库的应用程序时&#xff0c;如果…

【网络安全】网络安全协议的重要性

一.网络安全 1.什么是网络安全 网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 2.网络安…

智慧展厅设计的难点有哪些

1、运用先进的展示技术 将全息影像、三维投影、虚拟现实、人机互动等技术做做完美衔接&#xff0c;把展厅的内容展示做到丰富多彩&#xff0c;从而让展厅富有科技感和艺术性。 2、内容要生动有趣 从而更好地吸引参观者。展厅设计师要与客户有良好深入的沟通&#xff0c;搜集与整…

SAP 批量获取BOM中替代料信息(代码分享)

最近用户需要到导出BOM中存在替代料的信息,只要导出替代料的程序,但是使用展开BOM的程序执行后,导致执行时间很长,数量量也非常的大,内存溢出,程序就挂掉了。9万多个物料有BOM,当然不能让用户去导,后面我们写了一段SQL,用内表的方式给用户导出了需要的数据。 同时也找…

10.8k star,超好用的高颜值屏幕录制工具

最近公司需要给新来的同事做一些基础的培训。不过因为时间冲突&#xff0c;没办法现场给大家上课&#xff0c;所以老板让我自己在家把视频课程录制好&#xff0c;还说要让同事们看到我的样子。 这倒是有点费劲了&#xff0c;之前也录制过课程视频&#xff0c;但都是直接用屏幕…

小程序-修改用户头像

1、调用拍照 / 选择图片 // 修改头像 const onAvatarChange () > { // 调用拍照 / 选择图片 uni.chooseMedia({ // 文件个数 count: 1, // 文件类型 mediaType: [image], success: (res) > { console.log(res) // 本地临时文件路径 (本地路径) const { tempFilePath } …

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段&#xff0c;后端创建对应的实体类的时间属性需要设定格式&#xff08;默认的格式不方便阅读&#xff09;&#xff0c;再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…

PostgreSQL事务基础理解

PostgreSQL事务 事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。数据库事务通常包含一个序列对数据库的读和写操作&#xff0c;主要是包含以下两个目的&#xff1a; 为数据库操作序列提供一个从失败中恢复到正常状态的方法&#…

vue 打印、自定义打印、页面打印、隐藏页眉页脚

花了一天时间搞了个打印功能&#xff0c;现则将整体实现过程进行整理分享。先来看看效果图&#xff1a; 1、页面展示为&#xff1a; 2、重组页面打印格式为&#xff1a;这里重组页面的原因是客户要求为一行两列打印 &#xff01;内容过于多的行则独占一行显示完整。 整体实现&…

isscc2024 short course2 Performance Compute Environment

这部分分为4部分&#xff1a; 概览&#xff1a;LLMs和生成式AI 探讨大语言模型&#xff08;LLMs&#xff09;和生成式AI的整体环境&#xff0c;及其对硬件加速器设计的影响。 高性能AI加速器的特定考虑因素 广泛的模型和使用案例支持&#xff1a;需要设计能支持多种模型和应…

python中的线程并行

文章目录 1. 单线程2. 线程池ThreadPoolExecutor 1. 单线程 现在有1154张图片需要顺时针旋转后保存到本地&#xff0c;一般使用循环1154次处理&#xff0c;具体代码如下所示&#xff0c;img_paths中存储1154个图片路径&#xff0c;该代码段耗时约用97ms。 t1time.time() for …

SpringCloud系列(30)--准备使用Hystrix的前期工作,创建服务消费者模块

前言&#xff1a;在上一章节中我们创建了服务提供者模块&#xff0c;而本节内容则是创建服务消费者模块。 1、创建一个服务提供者模块&#xff0c;命名为cloud-consumer-feign-hystrix-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选择模块要使用的JDK版本 …

面向Prompt编程

Prompt 就像和一个人对话&#xff0c;你说一句&#xff0c;ta 回一句&#xff0c;你再说一句&#xff0c;ta 再回一句…… Prompt 就是你发给大模型的指令&#xff0c;比如「讲个笑话」、「用 Python 编个贪吃蛇游戏」、「给男/女朋友写封情书」等 貌似简单&#xff0c;但意义…

vue项目实战 - 如果高效的实现防抖和节流

在Vue项目中&#xff0c;处理高频事件的优化至关重要&#xff0c;直接影响用户体验和应用性能。防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常用且有效的方法&#xff0c;可以控制事件触发频率&#xff0c;减少不必要的资源消耗。如何在…