1. 程式人生 > >1 -- 標頭檔案 / 顯示圖片視訊 / 攝像頭操作 / 寫入視訊

1 -- 標頭檔案 / 顯示圖片視訊 / 攝像頭操作 / 寫入視訊

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;
}