二、OpenCV的第一個程序

文章目錄

    • 一、第一個程序:顯示圖片
      • 1.1 cv::imread
      • 1.2 cv::namedWindow
      • 1.3 cv::imshow
    • 二、第二個程序:視頻
      • 2.1 cv::VideoCapture
    • 三、加入了滑動條的基本瀏覽窗口

一、第一個程序:顯示圖片

示例:一個簡單的加載并顯示圖像的OpenCV程序

#include <iostream>
#include "./opencv2/opencv.hpp"int main() {cv::Mat image = cv::imread("D:/opencv_demo.png");if (image.empty()) {std::cout << "could not load image..." << std::endl;return 0;}cv::namedWindow("opencv_demo", 0);cv::imshow("opencv_demo", image);cv::waitKey(0);return 0;
}

OpenCV提供了一些實用工具來讀取從視頻流到攝像機畫面的各種各樣的圖像格式,這些工具都是HighGUI的一部分。我們將使用其中的一些工具來創建一個簡單的程序,這個程序將打開一張圖像并且將其顯示在屏幕上。

1.1 cv::imread

函數原型:

cv::Mat cv::imread(const std::string &filename, int flags = cv::IMREAD_COLOR);

作用:cv::imread 是 OpenCV 中用于從文件讀取圖像的函數。它的作用是將圖像文件讀取為 cv::Mat 類型的矩陣,方便后續進行圖像處理操作。

參數說明:
在這里插入圖片描述
常用 flags 參數:
在這里插入圖片描述
返回值:

  • 成功時返回一個包含圖像數據的 cv::Mat 對象;
  • 如果文件不存在或無法讀取,返回一個 空矩陣(可用 mat.empty() 檢查)。

1.2 cv::namedWindow

函數原型:

void cv::namedWindow(const std::string &winname, int flags = cv::WINDOW_AUTOSIZE);

作用:cv::namedWindow 是 OpenCV 中用于創建一個圖像顯示窗口的函數,通常和 cv::imshow 搭配使用。它可以指定窗口的名稱和一些屬性,如是否可以調整大小等。

參數說明:
在這里插入圖片描述

常用 flags 參數:
在這里插入圖片描述

1.3 cv::imshow

函數原型:

void cv::imshow(const std::string &winname, cv::InputArray mat);

作用:cv::imshow 是 OpenCV 中用于 顯示圖像 的函數,常與 cv::namedWindow 和 cv::waitKey 搭配使用,是圖像可視化的核心函數之一。

參數說明:
在這里插入圖片描述

二、第二個程序:視頻

示例:一個簡單的播放視頻文件的OpenCV程序

#include <iostream>
#include "./opencv2/opencv.hpp"int main() {// 嘗試打開視頻文件std::string videoPath = "video.mp4";cv::VideoCapture cap(videoPath);if (!cap.isOpened()) {std::cerr << "無法打開視頻文件:" << videoPath << std::endl;std::cerr << "請檢查文件路徑是否正確,是否存在視頻文件。" << std::endl;return -1;}// 創建顯示窗口cv::namedWindow("視頻播放", cv::WINDOW_NORMAL);cv::Mat frame;while (true) {// 讀取一幀bool success = cap.read(frame);if (!success || frame.empty()) {std::cout << "視頻播放完畢或讀取失敗。" << std::endl;break;}// 顯示當前幀cv::imshow("視頻播放", frame);// 每 25ms 等待一次按鍵(按 ESC 鍵退出)char key = (char)cv::waitKey(25);if (key == 27) break;  // ESC}// 釋放資源cap.release();cv::destroyAllWindows();return 0;
}

2.1 cv::VideoCapture

cv::VideoCapture 是 OpenCV 中用于 讀取視頻數據源 的類,既可以用來讀取視頻文件,也可以從攝像頭中實時采集圖像幀,是處理視頻流的核心組件之一。

常見構造方式:

cv::VideoCapture cap;                  // 空對象,后續調用 open()
cv::VideoCapture cap(0);              // 打開默認攝像頭
cv::VideoCapture cap("video.mp4");    // 打開視頻文件

也可以使用 .open(…) 動態打開源:

cv::VideoCapture cap;
cap.open("video.mp4");

常用函數說明:
在這里插入圖片描述

打開攝像頭示例:

cv::VideoCapture cap(0);  // 0 表示默認攝像頭
if (!cap.isOpened()) {std::cerr << "無法打開攝像頭!" << std::endl;return -1;
}

獲取常用視頻屬性:

double width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
double height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
double fps = cap.get(cv::CAP_PROP_FPS);
double totalFrames = cap.get(cv::CAP_PROP_FRAME_COUNT);

常見屬性 ID(用于 get() / set()):
在這里插入圖片描述

三、加入了滑動條的基本瀏覽窗口

在 OpenCV 中,如果你想播放視頻或瀏覽圖像,并添加滑動條(trackbar)來控制幀數或圖像編號,可以使用 cv::createTrackbar() 來實現。

示例:下面是一個帶滑動條的基本視頻瀏覽器示例,用戶可以通過滑動條選擇播放哪一幀

#include <iostream>
#include "./opencv2/opencv.hpp"cv::VideoCapture cap;
int totalFrames = 0;
int currentFrame = 0;// 滑動條回調函數
void onTrackbarSlide(int pos, void*) {cap.set(cv::CAP_PROP_POS_FRAMES, pos);  // 跳轉到對應幀cv::Mat frame;cap.read(frame);if (!frame.empty()) {cv::imshow("視頻瀏覽器", frame);}
}int main() {cap.open("video.mp4");  // 讀取視頻文件if (!cap.isOpened()) {std::cerr << "無法打開視頻文件!" << std::endl;return -1;}totalFrames = (int)cap.get(cv::CAP_PROP_FRAME_COUNT);cv::namedWindow("視頻瀏覽器", cv::WINDOW_NORMAL);cv::createTrackbar("位置", "視頻瀏覽器", &currentFrame, totalFrames - 1, onTrackbarSlide);// 顯示第一幀onTrackbarSlide(0, nullptr);// 等待按鍵退出while (true) {int key = cv::waitKey(0);if (key == 27) break;  // ESC 鍵退出}cap.release();cv::destroyAllWindows();return 0;
}

函數原型:

int cv::createTrackbar(const std::string &trackbarname,const std::string &winname,int *value,int count,TrackbarCallback onChange = 0,void* userdata = 0
);

參數說明:
在這里插入圖片描述

加上“播放/暫停控制”的滑動條視頻瀏覽器示例

#include "./opencv2/opencv.hpp"
#include <iostream>cv::VideoCapture cap;
int totalFrames = 0;
int currentFrame = 0;
bool isPlaying = false;// 滑動條回調函數
void onTrackbarSlide(int pos, void*) {cap.set(cv::CAP_PROP_POS_FRAMES, pos);cv::Mat frame;cap.read(frame);if (!frame.empty()) {cv::imshow("視頻瀏覽器", frame);}currentFrame = pos;
}int main() {cap.open("video.mp4");if (!cap.isOpened()) {std::cerr << "無法打開視頻文件!" << std::endl;return -1;}totalFrames = (int)cap.get(cv::CAP_PROP_FRAME_COUNT);cv::namedWindow("視頻瀏覽器", cv::WINDOW_NORMAL);cv::createTrackbar("位置", "視頻瀏覽器", &currentFrame, totalFrames - 1, onTrackbarSlide);onTrackbarSlide(0, nullptr);  // 顯示第一幀while (true) {if (isPlaying) {if (currentFrame < totalFrames - 1) {currentFrame++;cap.set(cv::CAP_PROP_POS_FRAMES, currentFrame);cv::Mat frame;cap.read(frame);if (!frame.empty()) {cv::imshow("視頻瀏覽器", frame);cv::setTrackbarPos("位置", "視頻瀏覽器", currentFrame);}cv::waitKey(30);  // 控制播放速度(幀率)} else {isPlaying = false;  // 到結尾停止}}int key = cv::waitKey(30);if (key == 27) break;               // ESC 退出else if (key == ' ') isPlaying = !isPlaying; // 空格鍵播放/暫停else if (key == 'r') onTrackbarSlide(0, nullptr); // r 鍵重播}cap.release();cv::destroyAllWindows();return 0;
}

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

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

相關文章

第14次:商品列表、熱銷商品及詳情

第1步&#xff1a;定義獲取商品列表的視圖類ListView&#xff0c;本視圖中完成了如下功能&#xff1a; 根據商品類別id獲取商品類別信息&#xff0c;并根據類別信息反向查詢到所有的該類別的商品。根據頁號和排序方式兩個參數&#xff0c;獲取某個頁面的商品列表信息。 #good…

基于雙層注意力重加權 LSTM 的中文長文本謠言檢測模型

文章目錄 1.摘要2.介紹3.相關工作3.1 假新聞檢測數據集3.2 假新聞檢測方法3.3 長文本假新聞檢測的挑戰與進展3.4 與現有方法的區別 4.方法4.1 模型結構4.2模型代碼4.3 損失函數與優化方法 5. 實驗5.1 數據集與預處理5.2 實驗設置5.3 實驗結果5.4 對比分析5.5 結果分析與討論 6.…

在 MyBatis 的xml中,什么時候大于號和小于號可以不用轉義

在 MyBatis 中&#xff0c;< 和 > ?在動態 SQL 標簽內部? 無需轉義的功能是在以下版本引入的&#xff1a; &#x1f4cc; 關鍵版本說明 版本支持情況注意事項?MyBatis 3.3.0??? 在 <if>、<where>、<set> 等動態 SQL 標簽內部可直接使用 < 和…

Redis 的穿透、雪崩、擊穿

Redis 的穿透、雪崩、擊穿 1、緩存穿透 定義 緩存穿透是指查詢一個不存在的數據&#xff0c;由于緩存中沒有該數據&#xff0c;每次請求都會直接訪問數據庫&#xff0c;導致數據庫壓力過大 產生原因 惡意攻擊&#xff1a;攻擊者故意請求大量不存在的key&#xff0c;導致請求直…

有道翻譯官手機版:智能翻譯,隨行助手

在當今全球化的時代&#xff0c;語言不再是交流的障礙。無論是學習外語、出國旅游、商務出差還是日常交流&#xff0c;一款高效、準確的翻譯軟件都能成為我們的好幫手。有道翻譯官手機版正是這樣一款功能強大、操作便捷的語言翻譯軟件&#xff0c;它憑借先進的翻譯技術和豐富的…

nuxt3 + vue3 分片上傳組件全解析(大文件分片上傳)

本文將詳細介紹一個基于 Vue.js 的分片上傳組件的設計與實現,該組件支持大文件分片上傳進度顯示等功能。 組件概述 這個上傳組件主要包含以下功能: 支持大文件分片上傳(默認5MB一個分片)支持文件哈希計算,用于文件唯一標識顯示上傳進度(整體和單個文件)支持自定義UI樣…

正則表達式與C++

轉自個人博客 1. 概述 1.1 正則表達式概述 正則表達式&#xff08;Regular Expressions&#xff0c;簡稱 regex&#xff09;是用于匹配文本模式的一種特殊字符序列&#xff0c;其可以用一系列字符來表示出不同文本的對應模式。正則表達式的應用范圍十分廣泛&#xff0c;包括驗…

OpenCV CUDA模塊設備層-----在 GPU上計算反雙曲正切函數atanh()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對輸入的 uchar1 像素值&#xff08;范圍 [0, 255]&#xff09;&#xff0c;先歸一化到 [0.0, 1.0] 浮點區間&#xff0c;然后計算其 反雙曲正切…

搶占西南產業高地:入駐成都芯谷金融中心文化科技產業園的價值

入駐成都芯谷金融中心文化科技產業園&#xff0c;對企業而言具有顯著的戰略價值&#xff0c;主要體現在以下幾個方面&#xff1a; 產業聚集效應與協同發展 產業鏈完善&#xff1a;成都芯谷聚焦集成電路、新型顯示、人工智能等核心產業&#xff0c;入駐企業可享受完善的產業鏈…

領域驅動設計(DDD)【2】之項目啟動與DDD基本開發流程

文章目錄 一 項目背景與目標二 核心需求分析初步需求詳細分析需求總結表 三 DDD核心概念與開發流程領域和領域專家領域驅動設計開發流程 四 潛在擴展需求 一 項目背景與目標 項目定位 開發基于SaaS的企業管理系統&#xff0c;聚焦軟件服務企業的細分市場&#xff0c;功能需求包…

深度融合數智化,百勝軟件聯合華為云加速零售行業轉型升級

當前&#xff0c;企業數字化轉型縱深推進&#xff0c;滿足企業數智化全階段、全場景的需求變得尤為關鍵。為此&#xff0c;華為云攜手上萬家伙伴共同發起第三屆828 B2B企業節&#xff0c;依托云底座為企業數智化供需“架橋”“鋪路”&#xff0c;加速企業智改數轉&#xff0c;助…

《HTTP權威指南》 第4章 連接管理

帶著問題學習&#xff08;通常是面試考點&#xff09; HTTP是如何使用TCP連接的TCP連接的時延、瓶頸及存在的障礙HTTP的優化&#xff0c;包括并行連接、keep-alive&#xff08;持久連接&#xff09;和管道化連接管理連接時應該和不應該做的事 TCP連接 TCP的數據通過IP分組&am…

StartUML入門級使用教程——畫Class類圖

一、破解安裝StartUML StarUML建模工具最新版破解安裝詳細教程https://blog.csdn.net/m0_74146638/article/details/148709643?spm1001.2014.3001.5502 二、類圖實戰 1.主界面 ? 默認打開starUML后&#xff0c;會默認進入類圖模式&#xff0c;各模塊區域功能如下&#x…

中科億海微SoM模組——FPGA+DSP核心板

FPGADSP核心板是基于中科億海微EQ6HL130型FPGA芯片搭配國產DSP開發的高性能核心板卡。對外接口采取郵票孔連接方式&#xff0c;可以極大提高信號傳輸質量和焊接后的機械強度。核心板卡的系統框圖如下圖所示。 圖 FPGADSP核心板系統框圖 FPGA采用中科億海微136K LUT資源EQ6HL130…

CentOS 7 虛擬機網絡配置異常 典型問題:啟動了NetworkManager但是network無法啟動

問題背景 在 VMware 虛擬機中使用 CentOS 7 時&#xff0c;出現以下網絡問題&#xff1a; 命令行重啟網絡服務失敗&#xff0c;提示 RTNETLINK answers: File exists 等沖突錯誤圖形界面網絡設置無法打開&#xff0c;提示需要啟動 NetworkManager網卡 ens33 無法獲取 IPv4 地…

細節/數學/滑動窗口

題目意思&#xff1a; 判斷字符串是否可以按照題目條件縮短。 思路&#xff1a; 用棧的思想寫&#xff0c;對每一次的大小寫都進行滾動判斷。 tips&#xff1a; 這里面要注意的東西就有一點多了&#xff0c;首先是字符串的遍歷問題auto更方便&#xff0c;其次是對小寫和大…

WebeServer實現:學到了哪些東西

前言 這里話就是總結一下之前沒講過的一些東西 系統調用 accept與accept4 ??當我們調用accept接收一個新的fd的時候&#xff0c;往往需要在調用fcntl將這個fd變成非阻塞IO,那么有沒有一個系統調用可以一次性做完這兩件事呢&#xff0c;有的有的就是accept4. // accept 函數…

React 虛擬dom

JSX創建出ReactElement對象 最終形成一個JS樹 將React.createElement對象轉為真實DOM的方法使用render函數 為什么要虛擬 dom 狀態難以跟蹤 ## 操作真實dom開銷大 &#xff0c;并且操作會引起頻繁的回流和重繪&#xff0c;并且不涉及批處理 聲明式編程 從虛擬dom向真實dom去…

Spring MVC異常處理機制

Spring MVC提供了多種異常處理機制,以下是核心處理方式及實現方法: 一、局部異常處理(Controller級別) @ExceptionHandler注解 在Controller內部定義異常處理方法,捕獲當前控制器拋出的指定異常。@Controller public class UserController {@GetMapping("/test"…

MySQL 8.x配置MGR高可用+ProxySQL讀寫分離(一):MGR構建MySQL高可用

#作者&#xff1a;stackofumbrella 文章目錄 簡介MGR優點MGR缺點MGR適用場景單主模式和多主模式組復制介紹組復制插件架構圖單主模式多主模式配置主機名解析安裝MGR插件 MGR故障轉移恢復MGR集群 簡介 MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本誕…