(一)opencv 視屏讀寫

yy小苗發表於2017-10-09

本文主要是寫了關於opencv視屏讀寫的操作


  1.第一段程式碼是寫了一個從左上角到右下角1-100不斷變換的視屏,最後進行儲存


  2.第二段程式碼是寫了一個從電腦攝像頭讀取視屏並儲存的視屏


  3.第三段程式碼是兩者的綜合


下面是具體的程式碼


//視屏繪製影象
#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"  

using namespace std; 
using namespace cv;

int main(int argc, char** argv)
{     //定義視訊的寬度和高度    
	Size s(320, 240);    
	//建立 writer,並指定 壓縮格式 及 FPS 等引數                                 
	VideoWriter writer = VideoWriter("myvideo.avi",-1, 25, s);//【名稱、壓縮格式(這裡手動選擇)、幀率、視屏長寬(解析度)】特別說明倒數第三個必須為 -1 否則會報錯
	//檢查是否成功建立     
	if(!writer.isOpened())   
	{      
		cerr << "Can not create video file.\n" << endl;         
		return -1;     
	} 
	  //視訊幀     
	Mat frame(s, CV_8UC3);  
	for (int i = 0; i < 100; i++) 
	{   //將影象置為黑色        
		frame = Scalar::all(255);         
		//將整數 i 轉為 i 字串型別        
		char text[128];         
		snprintf(text, sizeof(text), "%d", i);      
		//將數字繪到畫面上     
		putText(frame, text, Point(s.width*i/100, s.height*i/100), FONT_HERSHEY_SCRIPT_SIMPLEX, 3,       
			Scalar(0,0,255), 3, 8);    //【圖片、文字、文字框左下角、字型、字型大小、顏色、寬度、線型】  
		//將影象寫入視訊      
		writer << frame;    
	}  
											
	//退出程式時會自動關閉視訊檔案   
	return 0; 
}  





//呼叫攝像頭寫視屏

#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"  

using namespace std; 
using namespace cv;

int main(int argc, char** argv)
{     //定義視訊的寬度和高度    
	Size s(320, 240);    
	//建立 writer,並指定 壓縮格式 及 FPS 等引數    
	VideoCapture video(0);
        //VideoCapture cap("video.short.raw.avi"); //開啟指定視屏
	Mat frame;
	Size videoSize(1280, 960);
	VideoWriter writer("myvideo.avi", -1, 25, Size(frame.cols, frame.rows));//【名稱、壓縮格式(這裡手動選擇)、幀率、視屏長寬(解析度)】特別說明倒數第三個必須為 -1 否則會報錯
	//檢查是否成功建立     
	
	while(video.isOpened())
	{
		video >> frame;
		writer << frame;  
		imshow("video", frame);  
		if (waitKey(20) == 27)//27是鍵盤摁下esc時,計算機接收到的ascii碼值  
		{
			break;
		}
		
	}  
											
	//退出程式時會自動關閉視訊檔案   
	return 0; 
}  


//二者綜合

#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"  

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{     //定義視訊的寬度和高度    
	
	//建立 writer,並指定 壓縮格式 及 FPS 等引數    
	VideoCapture video(0);
	int w = static_cast<int>(video.get(CAP_PROP_FRAME_WIDTH));//獲取影象寬度
	int h = static_cast<int>(video.get(CAP_PROP_FRAME_HEIGHT));//獲取影象高度
	Size S(w, h);
	Mat frame;
	Size videoSize(1280, 960);
	VideoWriter writer("myvideo.avi", -1, 25, Size(frame.cols, frame.rows));//【名稱、壓縮格式(這裡手動選擇)、幀率、視屏長寬(解析度)】特別說明倒數第三個必須為 -1 否則會報錯
																			//檢查是否成功建立     
	int i = 1;
	while (video.isOpened())
	{
		if (i++ > 100) i = 1;
		video >> frame;
		char text[128];
		snprintf(text, sizeof(text), "%d", i);
		//將數字繪到畫面上     
		putText(frame, text, Point(S.width*i / 100, S.height*i / 100), FONT_HERSHEY_SCRIPT_SIMPLEX, 3,
			Scalar(0, 0, 255), 3, 8);    //【圖片、文字、文字框左下角、字型、字型大小、顏色、寬度、線型】  
										 //將影象寫入視訊     
		writer << frame;
		imshow("video", frame);
		if (waitKey(20) == 27)//27是鍵盤摁下esc時,計算機接收到的ascii碼值  
		{
			break;
		}

	}

	//退出程式時會自動關閉視訊檔案   
	return 0;
}










//putText 引數解釋
CV_EXPORTS_W void putText( InputOutputArray img, //待繪製文字的影象
							const String& text,//待繪製的文字
							Point org,//文字框左下角
							 int fontFace,//字型
							double fontScale, //字型大小
							Scalar color,//字型顏色 FONT_HERSHEY_SCRIPT_SIMPLEX(red)
							 int thickness = 1,//字型寬度
							int lineType = LINE_8, //線性,4/8鄰閾
						  bool bottomLeftOrigin = false
	);




相關文章