Linux上位機開發實戰(camera視頻讀取)

?【?聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】

? ? ? ? 關于linux camera,一般都是認為是mipi camera,或者是usb camera。當然不管是哪一種,底層的邏輯都是v4l2,這一點大家都一樣。只不過如果使用mipi camera,不僅要適配i2c驅動、mipi驅動、isp驅動,而且相關的協議手冊、驅動代碼,soc芯片廠家也未必提供的,這一點就比較麻煩。相比較而言,usb camera容易很多,sensor側的i2c、mipi已經不用自己處理,isp也是usb camera內部的mcu處理好了,所以剩下來的工作,就是usb uvc協議處理。這是一個標準協議。用起來比較方便,也不需要安裝額外的驅動,一般linux kernel都包含在內了。

? ? ? ? 在linux上面要獲取圖像有兩種軟件接口,一種就是借助于opencv來處理;另外一種就是自己編寫對應的v4l2接口。

1、opencv接口

? ? ? ? opencv是我們能夠想到的,最簡單、最直接的方法。不管是windows平臺,還是linux平臺,都可以通過opencv來獲取圖像。獲取視頻的流程基本就是三步。第一步,創建cv::VideoCapture對象。這個對象的輸入參數可以是阿拉伯數字,也可以是具體的文件名。如果是后一種情況,那么就變成從視頻讀取數據了。

? ? ? ? 第二步,確認設備是否打開。這一步就是調用一下isOpened()函數即可。第三步,就是直接從cv::VideoCapture導出圖像給cv::Mat,導出的方法使用的運算符>>,非常形象。

#include <opencv2/opencv.hpp>
#include <iostream>//#pragma comment(lib, "D:/software/opencv/build/x64/vc16/lib/opencv_world480d.lib")int main() 
{cv::VideoCapture cap(0);if (!cap.isOpened()) {return -1;}cv::Mat frame; while (true) {cap >> frame;if (frame.empty()) {break;}cv::imshow("video", frame);if (cv::waitKey(30) == 27) {break;}}cap.release();cv::destroyAllWindows();return 0;
}

2、v4l2接口

? ? ? ? v4l2接口是另外一種用的比較多的方式。和opencv相比較,v4l2肯定處理流程上更加復雜一點,但是好處就是我們可以通過v4l2對攝像頭做更加精準的控制。一種比較通用的情況就是,我們在實際使用的時候,都會關閉自動曝光,然后通過外部補充光源的形式,實現對光源的精確控制,從而可以保證可以穩定輸出高質量的圖片。

? ? ? ? 另外,對于一些自定義的v4l2接口,也是沒有辦法通過opencv來實現的。所以,對于很多稍微有點規模的圖像處理公司來說,它們習慣于自己編寫統一的圖像接口,兼容windows的directshow和linux的v4l2,這樣就不會受到兩個平臺的約束,類似于這樣的api接口,

#ifndef _CAMERA_API_H
#define _CAMERA_API_H#ifdef EXPORTS
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endifextern "C" 
{
DLLAPI int  CameraNumber();
DLLAPI int  EnumCameraIndex(char* vid, char* pid, unsigned char CamIndex[32]);
DLLAPI void*  CameraOpen(int index, int nWidth = 0, int nHeight = 0, const char* data_type = "");
DLLAPI int  CameraClose(void* pCamDev);
DLLAPI int  CameraWidth(void* pCamDev);
DLLAPI int  CameraHeight(void* pCamDev);
DLLAPI char* CameraDataType(void* pCamDev);
DLLAPI char* CameraName(void* pCamDev);
DLLAPI int  CameraQuery(void* pCamDev, unsigned char* szImageBuf);
}#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73226.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高性能緩存:使用 Redis 和本地內存緩存實戰示例

在現代高并發系統中&#xff0c;緩存技術是提升性能和降低數據庫壓力的關鍵手段。無論是分布式系統中的Redis緩存&#xff0c;還是本地高效的本地內存緩存&#xff0c;合理使用都能讓你的應用如虎添翼。今天&#xff0c;我們將基于go-dev-frame/sponge/pkg/cache庫的代碼示例&a…

Python實現deepseek接口的調用

簡介&#xff1a;DeepSeek 是一個強大的大語言模型&#xff0c;提供 API 接口供開發者調用。在 Python 中&#xff0c;可以使用 requests 或 httpx 庫向 DeepSeek API 發送請求&#xff0c;實現文本生成、代碼補全&#xff0c;知識問答等功能。本文將介紹如何在 Python 中調用 …

山東大學數據結構課程設計

題目&#xff1a;全國交通咨詢模擬系統 問題描述 處于不同目的的旅客對交通工具有不同的要求。例如&#xff0c;因公出差的旅客希望在旅途中的時間盡可能地短&#xff0c;出門旅游的旅客則期望旅費盡可能省&#xff0c;而老年旅客則要求中轉次數最少。編織一個全國城市間的交…

深入理解倒排索引原理:從 BitSet 到實際應用

倒排索引是一種極為重要的數據結構&#xff0c;它能夠高效地支持大規模數據的快速查詢&#xff0c;本文將深入探討倒排索引的原理&#xff0c;借助 BitSet 這種數據結構來理解其實現機制&#xff0c;并通過具體的JSF請求條件示例來展示其在實際應用中的運算過程。 BitSet&#…

Unity網絡開發快速回顧

知識點來源&#xff1a;總結人間自有韜哥在&#xff0c; 唐老獅&#xff0c;豆包 目錄 1.網絡通信-通信必備知識-IP地址和端口類2.網絡通信中序列化和反序列化2進制數據3.Socket類4.TCP同步服務端和客戶端基礎實現4.1.服務端基本實現4.2.客戶端實現&#xff1a; 5.區分消息類型…

內網滲透技術 Docker逃逸技術(提權)研究 CSMSF

目錄 如何通過上傳的webshell判斷當前環境是否是物理環境還是Docker環境 方法一&#xff1a;檢查文件系統 方法二&#xff1a;查看進程 方法三&#xff1a;檢查網絡配置 方法四&#xff1a;檢查環境變量 方法五&#xff1a;檢查掛載點 總結 2. 如果是Docker環境&#x…

動態規劃:從暴力遞歸到多維優化的算法進化論(C++實現)

動態規劃&#xff1a;從暴力遞歸到多維優化的算法進化論 一、動態規劃的本質突破 動態規劃&#xff08;Dynamic Programming&#xff09;不是簡單的遞歸優化&#xff0c;而是計算思維范式的革命性轉變。其核心價值在于通過狀態定義和決策過程形式化&#xff0c;將指數復雜度問…

數據結構與算法-數據結構-樹狀數組

概念 樹狀數組&#xff0c;也叫二叉索引樹&#xff08;Binary Indexed Tree&#xff0c;BIT&#xff09;&#xff0c;它是用數組來模擬樹形結構。樹狀數組的每個節點存儲的是數組中某一段的和&#xff08;或其他可合并的信息&#xff09;&#xff0c;通過巧妙的索引方式和樹形…

AI比人腦更強,因為被植入思維模型【19】三腦理論思維模型

定義 三腦理論思維模型是由美國神經科學家保羅麥克萊恩&#xff08;Paul MacLean&#xff09;提出的&#xff0c;該理論認為人類的大腦由三個不同但又相互關聯的部分組成&#xff0c;分別是爬蟲腦&#xff08;Reptilian Brain&#xff09;、邊緣腦&#xff08;Limbic Brain&am…

使用 patch-package 優雅地修改第三方依賴庫

在前端開發中&#xff0c;有時我們需要對第三方依賴庫進行修改以滿足項目需求。然而&#xff0c;直接修改 node_modules 中的文件并不是一個好方法&#xff0c;因為每次重新安裝依賴時這些修改都會丟失。patch-package 是一個優秀的工具&#xff0c;可以幫助我們優雅地管理這些…

馬科維茨均值—方差理論推導過程

下面給出一個詳細的、符號嚴謹、公式連貫的馬科維茨均值—方差理論推導過程&#xff0c;假設你輸入了 nnn 列股票的歷史收盤價數據。我們從數據符號的定義開始&#xff0c;逐步構建所有公式&#xff0c;并詳細解釋每個符號的意義。

僅靠prompt,Agent難以自救

Alexander的觀點很明確&#xff1a;未來 AI 智能體的發展方向還得是模型本身&#xff0c;而不是工作流&#xff08;Work Flow&#xff09;。還拿目前很火的 Manus 作為案例&#xff1a;他認為像 Manus 這樣基于「預先編排好的提示詞與工具路徑」構成的工作流智能體&#xff0c;…

【css酷炫效果】純CSS實現懸浮彈性按鈕

【css酷炫效果】純CSS實現懸浮彈性按鈕 緣創作背景html結構css樣式完整代碼效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;https://download.csdn.net/download/u011561335/90492020 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&…

決策樹基礎

決策樹 定義 從根節點開始&#xff0c;也就是擁有全部的數據&#xff0c;找一個維度對根節點開始劃分&#xff0c; 劃分后希望數據整體的信息熵是最小的&#xff0c; 針對劃分出來的兩個節點&#xff0c;我們繼續重復剛才的劃分方式尋找信息熵最小的維度和閾值。 遞歸這個…

動態查找表

1.問題分析&#xff1a; 動態查找表是一種可以動態地插入、刪除和查找元素的數據結構。它是基于二叉搜索樹實現的&#xff0c;具有快速的查找和插入操作。 以下是一些關于動態查找表的問題分析&#xff1a; 1. 插入操作&#xff1a;在動態查找表中插入一個元素時&#xff0c…

得分匹配的朗之萬動力學——Score-Matching Langevin Dynamics (SMLD)

得分匹配的朗之萬動力學——Score-Matching Langevin Dynamics (SMLD) 文章目錄 得分匹配的朗之萬動力學——Score-Matching Langevin Dynamics (SMLD)摘要Abstract周報內容0. 上期補充1. 本期的基本思想2. 從一個分布中采樣&#xff08;Sampling from a Distribution&#xff…

字節DAPO算法:改進DeepSeek的GRPO算法-解鎖大規模LLM強化學習的新篇章(代碼實現)

DAPO算法&#xff1a;解鎖大規模LLM強化學習的新篇章 近年來&#xff0c;大規模語言模型&#xff08;LLM&#xff09;在推理任務上的表現令人矚目&#xff0c;尤其是在數學競賽&#xff08;如AIME&#xff09;和編程任務中&#xff0c;強化學習&#xff08;RL&#xff09;成為…

【Qt】QWidget的styleSheet屬性

&#x1f3e0;個人主頁&#xff1a;Yui_ &#x1f351;操作環境&#xff1a;Qt Creator &#x1f680;所屬專欄&#xff1a;Qt 文章目錄 前言1. styleSheet屬性2. 利用styleSheet屬性實現簡單的日夜模式切換2.1 知識補充-計算機中的顏色表示 3. 總結 前言 style?好像前端的st…

QT Quick(C++)跨平臺應用程序項目實戰教程 2 — 環境搭建和項目創建

目錄 引言 1. 安裝Qt開發環境 1.1 下載Qt安裝包 1.2 安裝Qt 1.3 安裝MSVC編譯器 2. 創建Qt Quick項目 2.1 創建新項目 2.2 項目結構 2.3 運行項目 3. 理解項目代碼 3.1 main.cpp文件 3.2 Main.qml文件 引言 在上一篇文章中&#xff0c;我們介紹了本教程的目標和結…

macOS Sequoia 15.3 一直彈出“xx正在訪問你的屏幕”

&#x1f645; 問題描述 macOS 系統升級后&#xff08;15.2或者15.3均出現過此問題&#xff09;&#xff0c;不管是截圖還是開騰訊會議&#xff0c;只要跟捕捉屏幕有關&#xff0c;都一直彈出這個選項&#xff0c;而且所有軟件我都允許訪問屏幕了&#xff0c;這個不是詢問是否…