在c语言中调用外置摄像头,并且可以保存照片和录视频

由于项目需求,刚开始使用opencv,有什么问题请指教。

下面实例中,涉及到goto语句。

确认摄像头为几号,只需修改capture(0);

具体编译请看上篇有关环境搭建的博客。

如果视频不能正确显示,请确认如果是权限问题,加sudo。

或是请加延时。

如只需拍照或录视频,请自行裁剪。

#include <stdio.h>
#include <string>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
	VideoCapture capture(0);

	if(!capture.isOpened())
	{
		return -1;
	}

	cout<<"********************"<<endl;
	cout<<"******拍照:a ******"<<endl;
	cout<<"***錄視頻開始:b ***"<<endl;
	cout<<"***錄視頻結束:c ***"<<endl;
	cout<<"******退出:q ******"<<endl;
	cout<<"********************"<<endl;

	//获得帧的宽高  
	int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH));
	int h = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_HEIGHT));

	Mat frame,frame_write;
	
	int i = 0,j = 0;

	char image_name[20];
	while (1)
	{

		aa:if(!capture.read(frame))
			break;

		//capture >> frame;
		imshow("Video", frame);

		char key = (char)waitKey(10);
		//拍照
		//cout<<"4444444444444444"<<endl; 
		if(key=='a')
		{
			cout<<"開始拍照"<<endl;
			sprintf(image_name, "%s%d%s", "image", i, ".jpg");
			std::string str(image_name);
			cv::imwrite("./image/" +str, frame);
			waitKey(30);
			i++;
			cout<<"拍照ok"<<endl;			
			goto aa;	
		}
		//录视频
		else if(key=='b')
		{
			cout<<"開始錄視頻"<<endl;
			//保存视频名
			sprintf(image_name, "%s%d%s", "video", j, ".avi");
			std::string str(image_name);

			//视频写入对象
			VideoWriter outputVideo("./image/" +str, CV_FOURCC('X', 'V', 'I', 'D'), 30.0, Size(w, h));

			while(1)
			{
				//读取当前帧 
				if(!capture.read(frame))
					break;
				//capture >> frame;
	
				imshow("Video", frame);
				//写入文件
				outputVideo.write(frame); 

				char key1 = waitKey(10);
				if (key1 == 'q')
					return 0;
				else if (key1 == 'c')
					goto bb;
			}

			bb:j++;
			cout<<"錄視頻ok"<<endl;
			outputVideo.release();
			cvDestroyWindow("Video1"); 
			//goto cc;
			
		}
		//退出
		else if(key=='q')
		{
			cout<<"退出"<<endl;
			break;
		}
	}
	return 0;
}








/*
#include <stdio.h>
#include <string>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <opencv2/opencv.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
	VideoCapture capture(0);
	int i = 0;
	//std::string image_name;
	char image_name[20];
	while (1)
	{
		Mat frame;
		capture >> frame;
		imshow("dqsp", frame);
 


		//转换格式
		sprintf(image_name, "%s%d%s", "image", i, ".jpg");
		std::string str(image_name);
		
		cv::imwrite("./image/" +str, frame);
		waitKey(30);
		i++;
	}
	return 0;
}
*/




/*
#include "highgui.h"   
  
int main()  
{  
    CvCapture* pCap = cvCreateCameraCapture( 0 );//这里-1也可以,不过我的电脑装的有CyberLink YouCam软件,   
                                                 //OpenCV会默认调用该摄像头,而不调用系统的驱动   
    IplImage *frame = NULL;  
  
    if (cvCreateCameraCapture == NULL)  
    {  
        return(0);  
    }  
  
    cvNamedWindow("Camera",CV_WINDOW_FULLSCREEN);  
  
    while ((frame = cvQueryFrame(pCap)) != 0 &&  cvWaitKey(20) != 27)    
    {  
        frame = cvQueryFrame(pCap);  
        cvShowImage("Camera", frame);
	char key = (char)cvwaitKey(10);
	switch(key)
	{
		case 'a':imwrite("image",frame);
			break;
		default:
			break;
	}   
    }  
  
    cvReleaseCapture(&pCap);    
    cvDestroyWindow("Camera");    
    return (0);  
}  
*/
发布了26 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36662437/article/details/97628996
今日推荐