1 -- 標頭檔案 / 顯示圖片視訊 / 攝像頭操作 / 寫入視訊
阿新 • • 發佈:2018-12-12
1.標頭檔案
#include "opencv2/core/core.hpp" // 結構及數學運算 #include "opencv2/flann/miniflann.hpp" // 最近鄰搜尋匹配函式 #include "opencv2/imgproc/imgproc.hpp" // 影象處理函式 #include "opencv2/video/photo.hpp" // 操作和恢復照片相關演算法 #include "opencv2/video/video.hpp" // 視覺追蹤及背景分割 #include "opencv2/feature2d/feature2d.hpp" // 用於追蹤的二維特徵 #include "opencv2/objdetect/objdetect.hpp" // 級聯人臉分類器、latent SVM分類器、HoG特徵和平面片檢測器 #include "opencv2/ml/ml.hpp" // 機器學習、聚類、模式識別 #include "opencv2/highgui/highgui.hpp" // 滑動條、滑鼠操作、輸入輸出相關 #incldue "opencv2/contrib/contrib.hpp" // 使用者貢獻:面板檢測、模糊Mean-Shift追蹤、spin image演算法及自相似特徵等 // 儘量不要包含不用的類庫,會降低編譯速度
2.顯示圖片
using namespace cv;
Mat img = imread("1.jpg");
if(img.empty()) return -1;
namedWindow("Example", cv::WINDOW_AUTOSIZE);
imshow("Example", img);
waitKey(0); // >0的值為顯示毫秒數,<=0則無限等待
destroyWindow("Example");
3.顯示視訊
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" int main() { cv::namedWindow("example", cv::WINDOW_AUTOSIZE); cv::VideoCapture cap; cap.open("raw.avi"); cv::Mat frame; while (1) { cap >> frame; if (frame.empty()) break; cv::imshow("example", frame); if (cv::waitKey(33) >= 0) break; //如果有鍵盤輸入則退出 } return 0; }
4.為視訊新增滑動條實現跳轉(簡易播放器)
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <fstream> using namespace std; // 字首為 g_ 表示全域性變數 int g_slider_pos = 0; cv::VideoCapture g_cap; void onTrackbarSlider(int pos, void*) { g_cap.set(cv::CAP_PROP_POS_FRAMES, pos); } int main(){ cv::namedWindow("test", cv::WINDOW_AUTOSIZE); g_cap.open("raw.avi"); int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT); int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH); int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT); cout << "Video has " << frames << " frames of dimensions(" << tmpw << " ," << tmph << ")." << endl; cv::createTrackbar("Position", "test", &g_slider_pos, frames, onTrackbarSlider); cv::Mat frame; while (1) { g_cap >> frame; if (frame.empty()) break; int cur_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES); cv::setTrackbarPos("Position", "test", cur_pos); cv::imshow("test", frame); char c = (char)cv::waitKey(50); if (c == 27) break;//Esc鍵 } return 0; }
5.開啟攝像頭 / 寫入視訊檔案(.avi格式)
// 開啟攝像頭
cv::VideoCapture cap;
cap.open(0); // open the first camera
if (!cap.isOpened()) {
std::cerr << "Couldn't open capture." << std::endl;
return -1;
}
else {
cv::Mat frame;
while (1) {
cap >> frame;
cv::imshow("test", frame);
cv::waitKey(30);
}
}
// 寫入視訊,RGB視訊轉對數極座標視訊(裸眼角度)
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::namedWindow("test1", cv::WINDOW_AUTOSIZE);
cv::namedWindow("test2", cv::WINDOW_AUTOSIZE);
cv::VideoCapture capture("11.mp4");
double fps = capture.get(cv::CAP_PROP_FPS);
std::cout << fps << std::endl;
cv::Size size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH),
(int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));
cv::VideoWriter writer;
writer.open("22.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size);
cv::Mat logpolar_frame, bgr_frame;
while (1) {
capture >> bgr_frame;
if (bgr_frame.empty()) break;
cv::imshow("test1", bgr_frame);
cv::logPolar(bgr_frame, logpolar_frame, cv::Point2f(bgr_frame.cols/2 , bgr_frame.rows/2 ), 40, cv::WARP_FILL_OUTLIERS);
cv::imshow("test2", logpolar_frame);
writer << logpolar_frame;
if (cv::waitKey(10) == 27) break;
}
capture.release();
return 0;
}