在C++項目中添加錄像功能:從攝像頭捕獲到視頻文件的保存

在C++項目中添加錄像功能:從攝像頭捕獲到視頻文件的保存

在這篇博客中,我們將介紹如何在一個現有的C++項目中添加錄像功能,具體包括如何從攝像頭捕獲圖像并將其保存為視頻文件。我們將使用OpenCV庫來處理圖像捕獲和視頻寫入。

目錄

  1. 引言
  2. 準備工作
  3. 包含必要的頭文件
  4. 添加錄像功能的變量
  5. 初始化錄像功能
  6. 在主循環中添加錄像邏輯
  7. 控制錄像的開始和停止
  8. 釋放資源
  9. 完整示例代碼

1. 引言

在計算機視覺應用中,常常需要從攝像頭捕獲圖像并進行處理。為了記錄這些圖像,我們可以將其保存為視頻文件。使用OpenCV庫,我們可以輕松實現這一功能。本文將逐步講解如何在你的C++項目中集成錄像功能。

2. 準備工作

在開始之前,請確保你已經安裝了OpenCV庫,并且你的開發環境已經配置好以使用OpenCV。如果還沒有安裝,可以參考OpenCV官方網站獲取安裝和配置指南。

3. 包含必要的頭文件

首先,確保你的代碼中包含了OpenCV和其他必要的頭文件。以下是示例代碼的頭文件部分:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <QString>
#include <chrono>
#include <thread>
#include "UdpUtil.h"
#include "lcmUtil.h"
#include "mythread.h"
#include "colorgroup.h"using namespace std;
using namespace std::chrono;
using namespace cv;

4. 添加錄像功能的變量

我們需要一些變量來控制錄像功能,例如一個VideoWriter對象來保存視頻文件,以及一個布爾標志來控制錄像的開始和停止:

bool isRecording = false;
VideoWriter videoWriter;
std::string outputVideoFile = "output.avi";

5. 初始化錄像功能

在攝像頭成功打開后,我們需要初始化VideoWriter對象。以下是初始化的代碼片段:

for (int i = 0; i <= 3; i++) {cap.open(i);if (!cap.isOpened()) {printf("打開攝像頭失敗:number=%d\n", i);if (i == 3) return 0;} else {printf("打開攝像頭成功:number=%d\n", i);// 獲取攝像頭幀率double fps = cap.get(CAP_PROP_FPS);if (fps == 0) fps = 30; // 如果無法獲取幀率,設置一個默認值// 獲取幀的寬度和高度int frameWidth = cap.get(CAP_PROP_FRAME_WIDTH);int frameHeight = cap.get(CAP_PROP_FRAME_HEIGHT);// 初始化VideoWritervideoWriter.open(outputVideoFile, VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(frameWidth, frameHeight), true);if (!videoWriter.isOpened()) {cerr << "無法打開視頻文件進行寫入\n";return -1;}break;}
}

6. 在主循環中添加錄像邏輯

在主循環中,我們將每一幀寫入視頻文件。以下是代碼示例:

while (1) {cap >> srcImage;if (!srcImage.empty()) {imageProcess(srcImage);  // 圖像處理和指令發送lcmutil->send(v_des, gait_type, step_height, stand_height, rpy_des); // 發送步態指令logMode();  // 打印狀態// 寫入當前幀到視頻文件if (isRecording) {videoWriter.write(srcImage);}if (flag) {colorgroup.showPicture(srcImage, 1);colorgroup.start();if (udpsocket.ifReceiveInfoFlag != 0) {switch (udpsocket.ifReceiveInfoFlag) {case 1: // 選擇顏色并返回閾值colorgroup.chooseColor(udpsocket.color);colorgroup.sendColorThreadhold();colorgroup.ifRunContinueFlag = true;break;case 2: // 設置顏色閾值colorgroup.setColorThreadhold(udpsocket.colorThreadhold);break;case 3: // 保存顏色閾值colorgroup.save();break;}udpsocket.ifReceiveInfoFlag = 0;}}}QThread::msleep(20);
}

7. 控制錄像的開始和停止

我們可以通過檢查某些條件或命令行參數來控制錄像的開始和停止。以下是一個示例,其中通過輸入參數控制錄像:

else if (argc >= 2) {inputParameters1 = argv[1];if (inputParameters1 == "record") {printf("錄像模式\n");isRecording = true;}// 其他模式...
}

8. 釋放資源

在程序結束時,確保釋放VideoWriter對象和其他資源:

printf("程序運行結束\n");
cap.release();
if (videoWriter.isOpened()) {videoWriter.release();
}
return 0;

9. 完整示例代碼

以下是集成了錄像功能的完整示例代碼:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <QString>
#include <chrono>
#include <thread>
#include "UdpUtil.h"
#include "lcmUtil.h"
#include "mythread.h"
#include "colorgroup.h"using namespace std;
using namespace std::chrono;
using namespace cv;int main(int argc, char* argv[]) {UdpUtil udpsocket;QString inputParameters1;QString inputParameters2;bool flag = false; // 該標志位用于是否顯示圖像bool isRecording = false; // 錄像標志位VideoWriter videoWriter;std::string outputVideoFile = "output.avi";static steady_clock::time_point start;if (argc == 1) {printf("using default parameter mode is track\n");printf("mode is track\n");printf("default residenceColor is red\n");mythread.mode = track;residenceColor = "brown";} else if (argc >= 2) {inputParameters1 = argv[1];if (inputParameters1 == "track") {printf("mode is track\n");printf("default residenceColor is null\n");mythread.mode = track;} else if (inputParameters1 == "brown") {printf("mode is track\n");printf("input residenceColor is brown\n");mythread.mode = track;residenceColor = "brown";} else if (inputParameters1 == "violet") {printf("mode is track\n");printf("input residenceColor is violet\n");mythread.mode = track;residenceColor = "violet";} else if (inputParameters1 == "stop") {printf("mode is stop\n");mythread.mode = stop;} else {mythread.mode = track;printf("parameters error\n");printf("mode is track\n");}if (argc == 3) {inputParameters2 = argv[2];if (inputParameters2 == "red") {printf("mode is track\n");printf("input divergerColor is red\n");mythread.mode = track;divergerColor = "red"; printf("start to show image\n");flag = true;udpsocket.start();} else if (inputParameters2 == "green") {printf("mode is track\n");printf("input divergerColor is green\n");mythread.mode = track;divergerColor = "green"; printf("start to show image\n");flag = true;udpsocket.start();} else if (inputParameters2 == "showImage") {printf("start to show image\n");flag = true;udpsocket.start();} else if (inputParameters1 == "record") {printf("錄像模式\n");isRecording = true;}}}for (int i = 0; i <= 3; i++) {cap.open(i);if (!cap.isOpened()) {printf("打開攝像頭失敗:number=%d\n", i);if (i == 3) return 0;} else {printf("打開攝像頭成功:number=%d\n", i);double fps = cap.get(CAP_PROP_FPS);if (fps == 0) fps = 30;int frameWidth = cap.get(CAP_PROP_FRAME_WIDTH);int frameHeight = cap.get(CAP_PROP_FRAME_HEIGHT);videoWriter.open(outputVideoFile, VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(frameWidth, frameHeight), true);if (!videoWriter.isOpened()) {cerr << "無法打開視頻文件進行寫入\n";return -1;}break;}}lcmUtil *lcmutil = new lcmUtil;mythread.start();while (1) {cap >> srcImage;if (!srcImage.empty()) {imageProcess(srcImage);lcmutil->send(v_des, gait_type, step_height, stand_height, rpy_des);logMode();if (isRecording) {videoWriter.write(srcImage);}if (flag) {colorgroup.showPicture(srcImage, 1);colorgroup.start();if (udpsocket.ifReceiveInfoFlag != 0) {switch (udpsocket.ifReceiveInfoFlag) {case 1:colorgroup.chooseColor(udpsocket.color);colorgroup.sendColorThreadhold();colorgroup.ifRunContinueFlag = true;break;case 2:colorgroup.setColorThreadhold(udpsocket.colorThreadhold);break;case 3:colorgroup.save();break;}udpsocket.ifReceiveInfoFlag = 0;}}}QThread::msleep(20);}printf("程序運行結束\n");cap.release();if (videoWriter.isOpened()) {videoWriter.release();}return 0;
}

通過以上步驟,你可以在你的C++項目中成功添加錄像功能,將攝像頭捕獲的圖像保存為視頻文件。希望這篇博客能對你有所幫助!

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

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

相關文章

Python學習筆記35:進階篇(二十四)pygame的使用之音頻文件播放

前言 基礎模塊的知識通過這么長時間的學習已經有所了解&#xff0c;更加深入的話需要通過完成各種項目&#xff0c;在這個過程中逐漸學習&#xff0c;成長。 我們的下一步目標是完成python crash course中的外星人入侵項目&#xff0c;這是一個2D游戲項目。在這之前&#xff…

元組列表之案例

1.列表推導式 基本語法&#xff1a; [表達式 for語句1 if 語句1 for語句2 if語句2 ........ ] 1.零到九的平方列表 a [i*i for i in range(10)] print(a) 2.for 循環前面加if else #如果是偶數乘以2&#xff0c;如果是奇數直接輸出 a [i*2 if i%2 0 else i for i in ran…

什么是生成器函數?

生成器函數&#xff08;Generator Function&#xff09;是 JavaScript 中一種特殊的函數&#xff0c;它可以在執行過程中暫停并在之后恢復執行。生成器函數使用 function* 語法定義&#xff0c;并且內部使用 yield 表達式來暫停函數執行并返回一個值。每次調用生成器函數返回的…

rabbitmq集群創建admin用戶之后,提示can access virtual hosts是No access狀態

問題描述&#xff1a; 因業務需要使用的rabbitmq是3.7.8版本的&#xff0c;rabbitmq在3.3.0之后就允許使用guest賬號的權限了&#xff0c;所以需要創建一個administrator標簽的用戶。 如下操作創建的用戶&#xff1a; 創建完成之后就提示如下的報錯&#xff1a; 注&#xff1a…

php表單提交并自動發送郵件給某個郵箱(示例源碼下載)

只需要將以下代碼內容進行復制即可用到自己的程序/API接口中&#xff1a; <?php if(!empty($_POST[is_post]) && $_POST[is_post]1){$url "https://www.aoksend.com/index/api/send_email";$name $_POST[name];$email $_POST[email];$subject $_POS…

探索Mojo模型:解鎖機器學習模型的可解釋性之旅

探索Mojo模型&#xff1a;解鎖機器學習模型的可解釋性之旅 在人工智能和機器學習領域&#xff0c;模型的可解釋性是一個至關重要的議題。隨著模型變得越來越復雜&#xff0c;理解模型的決策過程成為了一個挑戰。Mojo模型作為一種模型序列化格式&#xff0c;提供了一種方法來部…

Python 給存入 Redis 的鍵值對設置過期時間

Redis 是一種內存中的數據存儲系統&#xff0c;與許多傳統數據庫相比&#xff0c;它具有一些優勢&#xff0c;其中之一就是可以設置數據的過期時間。通過 Redis 的過期時間設置&#xff0c;可以為存儲在 Redis 中的數據設置一個特定的生存時間。一旦數據到達過期時間&#xff0…

mybatis日志記錄方案

首先對指定表進行監控 對表進行監控,那么就要使用的是statementInterceptor 攔截器 使用攔截器那么就要寫intercepts寫攔截條件進行攔截 監控只對與增刪改 查詢不進行監控 對于字段的監控,是誰修改了字段,那么就進行報警,或者提醒 消息提醒使用釘釘機器人進行消息提醒 P…

軟鏈接node_modules

公司項目很多微應用的子項目公用同一套模板&#xff0c;也就會使用同一個node_modules 1.先創建3個同樣的項目,并安裝一個其中的一個node_modules給他丟到外邊 2.win r -------> cmd --------> ctrlshift enter(已管理員身份打開cmd) 3.在窗口分別執行以下代碼…

視頻減小技巧:十大頂級視頻壓縮軟件

視頻壓縮軟件會盡可能地壓縮視頻&#xff0c;以便上傳到各個網站。通常&#xff0c;4K 或更高質量的視頻體積更大。壓縮軟件有助于壓縮體積。在這里&#xff0c;我們來討論一下 10 款最佳視頻壓縮軟件。 十大頂級視頻壓縮軟件 1. 奇客壓縮寶 奇客壓縮寶是由Geekersoft公司開發…

基于SpringBoot+MySQL的租房項目+文檔

&#x1f497;博主介紹&#x1f497;&#xff1a;?在職Java研發工程師、專注于程序設計、源碼分享、技術交流、專注于Java技術領域和畢業設計? 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的老師 Wechat / QQ 名片 :) Java精品實戰案例《700套》 2025最新畢業設計選題推薦…

數據庫系統中的Undo和Redo

在數據庫管理系統&#xff08;DBMS&#xff09;中&#xff0c;undo 和 redo 是兩種用于事務管理和故障恢復的重要機制。它們主要涉及事務的提交、回滾以及系統故障后的數據恢復。 Undo&#xff08;撤銷&#xff09; 作用&#xff1a;undo 用于撤銷未提交事務所做的修改&#…

極狐Gitlab使用(1)

目錄 續接上篇&#xff1a;極狐Gitlab安裝部署-CSDN博客 1. 關閉注冊功能 2. 創建群組 3. 創建用戶 5. 邀請成員到群組 6. 設置導入導出項目源 7. 通過gitee導入庫 8. 通過倉庫URL導入 9. 自創建項目 10. 默認分支main的權限 11. 使用普通用戶進入自建庫 12. 創建用…

java的遍歷的方法對比 效率對比

在 Java 中&#xff0c;遍歷對象的方式主要取決于對象的類型和數據結構。以下是幾種常見的遍歷方式&#xff0c;以及它們的效率比較&#xff1a; 普通的 for 循環&#xff1a; 效率&#xff1a;高。使用普通的 for 循環可以直接根據索引來訪問元素&#xff0c;適用于數組和實現…

Ubuntu系統上安裝Apache和WordPress

** 第一步跟新系統包 ** 首先跟新系統包 sudo apt update sudo apt upgrade第二步下載安裝apache sudo apt install apache2 ##查看apache的狀態是否啟動成功 sudo systemctl status apache2 ##查看服務器的ip地址 sudo ip a通過ip地址進行訪問apache頁面 第三步下載安裝…

git patch怎么使用?

通常當我們提到 "patch" 時&#xff0c;我們可能指的是以下幾種情況&#xff1a; 1. **應用補丁文件**&#xff1a; 如果你有一個 .patch 文件&#xff0c;你可以使用 git apply 命令來應用它。 bash git apply your-patch-file.patch 這會將補丁文件中的更改應用到…

軟件架構之嵌入式系統設計

軟件架構之嵌入式系統設計 第 12 章&#xff1a;嵌入式系統設計12.1 嵌入式系統概論12.2 嵌入式系統的組成12.2.1 硬件架構12.2.2 軟件架構 12.3 嵌入式開發平臺與調試環境12.3.1 嵌入式系統軟件開發平臺12.3.2 嵌入式開發調試 第 12 章&#xff1a;嵌入式系統設計 隨著計算機…

力扣 1兩數之和

nums [2,7,6,3] target 9 需要在這個中找到 nums中數字下標&#xff0c;累加和等于target 也就是說既要數字下標&#xff0c;又要nums中數字&#xff0c;還要查找 因此&#xff0c;考慮map這種既有key 又有value的哈希表 問題是 map,unordered_map, muti_map用哪一個呢&a…

人工智能時代,零基礎學IT,我首推Python作為你編程入門語言!

人工智能時代為什么將 Python 稱為第一語言&#xff1f; 因為python適應了人工智能時代&#xff1a; 人工智能時代對于代碼的簡便性有很大要求&#xff0c;像傳統的C/CPP/Java學習較為復雜&#xff0c;學習路線長&#xff0c;對于很多零基礎的人入門困難。python的兼容性&…

k8s集群部署mysql8主備

一、搜索mysql8版本 # helm search repo mysql# helm pull bitnami/mysql --version:11.1.2# tar -zxf mysql-11.1.2.tgz# cd mysql 二、修改value.ysqml文件 動態存儲類自己提前搭建。 # helm install mysql8 -n mysql-cluster ./ -f values.yaml NAME: mysql8 LAST DEPLOYED…