FPGA 第4章 摄像头Bayer转rgb

参考文献
彩色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) beginhsync_i_1 <= 1'b0;hsync_i_2 <= 1'b0;hsync_i_3 <= 1'b0;endelse beginhsync_i_1 <= hsync_i;hsync_i_2 <= hsync_i_1;hsync_i_3 <= hsync_i_2;end
endalways @ (posedge pclk or negedge s_rst_n) begin if(s_rst_n == 1'b0) beginvsync_i_1 <= 1'b0;vsync_i_2 <= 1'b0;vsync_i_3 <= 1'b0;endelse beginvsync_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) beginif(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) beginif(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) beginif(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]};elsedata_control <= 3'b100;       
end

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

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

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

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

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

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


always @ (posedge pclk or negedge s_rst_n) beginif(s_rst_n == 1'b0) beginline1_1    <= 8'd0;line1_2    <= 8'd0;line2_1 <= 8'd0;line2_2 <= 8'd0;endelse beginline1_1    <= line_1;line1_2    <= line1_1;line2_1    <= line_2;line2_2    <= line2_1;end    endalways @ (data_control) begincase(data_control)3'b000 : begin rgb_r = line1_1; rgb_g = line2_1 + line1_2; rgb_b = line2_2;end3'b001 : beginrgb_r = line1_2;rgb_g = line1_1 + line2_2; rgb_b = line2_1;end3'b010 : beginrgb_r = line2_1;rgb_g = line1_1 + line2_2;rgb_b = line1_2;end3'b011 : beginrgb_r = line2_2;rgb_g = line2_1 + line1_2;rgb_b = line1_1;enddefault: begin rgb_r = 8'd0;rgb_g = 9'd0;rgb_b = 8'd0; endendcase
endassign 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.mzph.cn/web/15045.shtml

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

相关文章

【linux-IMX6ULL-LED字符驱动框架完善】

目录 1.简介&#xff12;.前置知识2.1 重要函数及结构体2.2 程序框架流程 3. 代码详解&#xff1a; 1.简介 在上节&#xff0c;我对linux-IMX6ULL-字符设备驱动简单框架实验进行了说明和构建&#xff0c;但是也存在几个问题&#xff1b; 需要手动指定设备号&#xff0c;不能自…

TCP 与 UDP

0. tcp 与 udp 的 异同特性 TCPUDPname传输控制协议用户数据报协议面向连接&#xff1f; 需要 传输数据前建立连接传输完毕后断开连接不需要可靠的传输数据&#xff1f; 可靠 有确认机制&#xff08;三次握手&#xff09; 有确认、窗口、重传、拥塞控制的机制保证数据可靠传输…

itertools拼装迭代器

itertools拼装迭代器 连接多个迭代器 内置的itertools模块有一些函数可以把多个迭代器连城一个使用。 chain chain可以把多个迭代器从头到尾连成一个迭代器。 import itertoolsit itertools.chain([1, 2, 3], [4, 5, 6]) print(list(it))>>> [1, 2, 3, 4, 5, 6]…

操作视频号小店,新手最关心的问题,一篇给你讲解清楚!

大家好&#xff0c;我是电商小V 新手去做视频号小店的时候&#xff0c;心里面一定是有很多疑问的&#xff0c;会反复咨询一些最关心的问题&#xff0c;因为他们要做好准备&#xff0c;以防后续做店过程中出现问题&#xff0c;其实新手关心的问题就那几个&#xff0c;咱们今天就…

C++贪心算法3

过河的最短时间 #include<bits/stdc.h> using namespace std; void f(int); int n; int main() {system("color 1");cin>>n;int a[10010];for(int i0;i<n;i){cin>>a[i];}sort(a0,an);int ta[1];int k1n-2;int k2n-1;while(true){int t1a[0]a[k…

springboot2+mybatis-plus+vue3创建入门小项目[学生管理系统]02[实战篇]

创建一个 vue 项目 创建这个新的文件夹 创建前端项目 eggbox 数据库 SQL CREATE DATABASE IF NOT EXISTS egg DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; USE egg;CREATE TABLE stu (id INT AUTO_INCREMENT, -- 自增主键name VARCHAR(64) NOT NULL, -- 非空姓名字段&a…

前端传参的三种方式

1、params 传参 参数拼接在地址 url 的后面给后台&#xff1b;地址栏中可见 案例1 地址栏&#xff1a;https://xxxxxxxx/admin/clues/detail?id558 接口代码&#xff1a; export function getClueDetail(query: any) {return request<clueItem>({url: /clues/detai…

Java:图书管理系统

目录 一.book 1.在book包中的Book 类用来定义和引用书的名字&#xff0c;作者&#xff0c;价格&#xff0c;类型等。 2.在book包中的第二个类是BookList是用来构建书架&#xff0c;和书架上的初始书本&#xff0c; 二、ioperations 1.AddOperation (增加图书) 2.BorrowOp…

保研机试算法训练个人记录笔记(七)

输入格式&#xff1a; 在第1 行给出不超过10^5 的正整数N, 即参赛&#xff5d;人数。随后N 行&#xff0c;每行给出一位参赛者的 信息和成绩&#xff0c;包括其所代表的学校的编号&#xff08;从1 开始连续编号&#xff09;及其比赛成绩&#xff08;百分制&#xff09;&#xf…

Linux环境基础开发工具的使用(yum,vim,gcc/g++,make/Makefile,gdb)

Linux 软件包管理器-yum 什么是软件包及安装方式 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理…

数据结构——栈(详细分析)

目录 &#x1f349;引言 &#x1f349;栈的本质和特点 &#x1f348;栈的基本操作 &#x1f348;栈的特点 &#x1f34d;后进先出 &#x1f34d;操作受限 &#x1f34d;动态调整 &#x1f348;栈的优缺点 &#x1f34d;优点 &#x1f34d;缺点 &#x1f349;栈的应用…

002 递归评论 mongodb websocket消息推送

文章目录 商品评论CommentController.javaComment.javaCommentServiceImpl.javaCommentRepository.javaCommentService.javaWebSocketConfig.javaWebSocketProcess.javaapplication.yamlproductReview.htmlindex.htmlindex.jsindex.css 订单评论EvaluateMapper.xmlEvaluateMapp…

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

前言 大家好&#xff0c;我是老马。很高兴遇到你。 作为一个 java 开发者&#xff0c;工作中一直在使用 nginx。却发现一直停留在使用层面&#xff0c;无法深入理解。 有一天我在想&#xff0c;为什么不能有一个 java 版本的 nginx 呢&#xff1f; 一者是理解 nginx 的设计…

HTTP 协议中 GET 和 POST 有什么区别?分别适用于什么场景?

HTTP 协议中 GET 和 POST 是两种常用的请求方法&#xff0c;它们的区别如下: 1. 参数传递方式不同 GET 请求参数是在 URL 中以键值对的形式传递的&#xff0c;例如:http://www.example.com/&#xff1f;key1value1&k ey2value2。 而 POST 请求参数是在请求体中以键值对的…

SQOOP详细讲解

SQOOP安装及使用 SQOOP安装及使用SQOOP安装1、上传并解压2、修改文件夹名字3、修改配置文件4、修改环境变量5、添加MySQL连接驱动6、测试准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库impo…

数据访问与Spring Data JPA

数据访问与Spring Data JPA 在现代Java应用程序中&#xff0c;持久化数据是核心功能之一。Spring Data JPA&#xff08;Java Persistence API&#xff09;为开发者提供了一种简单且高效的方式来访问和操作数据库。在本博文中&#xff0c;我将向您展示如何使用Spring Data JPA来…

数据结构------二叉树经典习题2

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1.非递归的前序遍历 1.用栈来实现 2,前序遍历是根左右, 先是根节点入栈,,然后不为空时向左遍历,当为空时就返回向右遍历,右为空时直接出栈,依次循环即可. public void preOrderNot(TreeNode root){Stack<TreeNo…

科技赋能,打破视障人士的沟通壁垒

在探索如何增强盲人群体的社会参与度与幸福感的旅程中&#xff0c;盲人社交能力提升策略成为了不容忽视的一环。随着科技的不断进步&#xff0c;像“蝙蝠避障”这样的辅助软件&#xff0c;不仅在日常出行中为盲人提供了实时避障和拍照识别的便利&#xff0c;也在无形中为他们拓…

华为数通 HCIP-Datacom(H12-821)题库

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 BGP路由的Update消息中可不包含以下哪些属性&#xff1f; A、Local Preference B、AS Path C、MED D、Origin 答案&#xff1a;AC 解析&#xff1a;as-path和ori…

深度学习训练框架——监督学习为例

训练框架 文章目录 训练框架1. 模型网络结构2. 数据读取与数据加载2.1Dataloater参数2.2 collate_fn 3. 优化器与学习率调整3.1 优化器3.2 学习率调度 4迭代训练4.1 train_epoch4.2 train iteration 5.1 保存模型权重 本文内容以pytorch为例 1. 模型网络结构 自定义网络模型继…