文章目錄
- 一、第一個程序:顯示圖片
- 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("位置", "視頻瀏覽器", ¤tFrame, 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("位置", "視頻瀏覽器", ¤tFrame, 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;
}