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.pswp.cn/web/15045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15045.shtml
英文地址,請注明出處:http://en.pswp.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. 模型網絡結構 自定義網絡模型繼…