OpenCv调用摄像头拍照代码

7 篇文章 0 订阅
7 篇文章 0 订阅

最近在研究OpenCv对摄像头的调用。现将代码贴出,供大家批评指正。

1、申明

#include"./opencv2/opencv.hpp"

#ifdef _DEBUG

#pragma comment(lib,"opencv_core249d.lib")
#pragma comment(lib,"opencv_highgui249d.lib")

#else

#pragma comment(lib,"opencv_core249.lib")
#pragma comment(lib,"opencv_highgui249.lib")

#endif

using namespace cv;

class COpencvCameraCtrl :
	public CCameraBase
{
public:
	VideoCapture vc;
public:
	COpencvCameraCtrl(void);
	~COpencvCameraCtrl(void);

public:
	BOOL OpenCamera( HWND win, CString strVid, CString strPid );		//打开摄像头
	BOOL PhotoPic( CString strSaveFile );
	void CloseCamera();
};


2、打开摄像头

//打开摄像头
BOOL COpencvCameraCtrl::OpenCamera(HWND win, CString strVid, CString strPid)
{
	InitCameraWin( win );

	vid = strVid;
	pid = strPid;

	nIndex = GetCameraIndexInOs( vid, pid );

	if( nIndex < 0 )
	{
		return FALSE;
	}
	
	if( !vc.open( nIndex ) )
	{
		return FALSE;
	}

	vc.set( CV_CAP_PROP_FRAME_WIDTH, nWidth );
	vc.set( CV_CAP_PROP_FRAME_HEIGHT, nHight );	

	if( !vc.isOpened() )
	{
		bOpen = false;
		return FALSE;
	}

	bOpen = true;	

	return TRUE;
}


3、关闭摄像头

//关闭摄像头
void COpencvCameraCtrl::CloseCamera()
{
	if( vc.isOpened() )
	{
		vc.release();
	}	
}


4、拍照并且保存到本地

//拍摄摄像头
BOOL COpencvCameraCtrl::PhotoPic( CString strSaveFile )
{
	Mat frame;
	
	vc >> frame;
	vc >> frame;
	
	if( !frame.data )
	{
		return FALSE;
	}

	//设置图像质量
	vector<int> compression_params;
	compression_params.push_back( IMWRITE_JPEG_QUALITY );
	compression_params.push_back( 75 );

	imwrite( strSaveFile.GetBuffer(0), frame, compression_params );
	strSaveFile.ReleaseBuffer();	

	return TRUE;
}


需要说明的是:每次从摄像头获取数据到Mat,需要执行两次

Mat frame;
	
	vc >> frame;
	vc >> frame;
	
	if( !frame.data )
	{
		return FALSE;
	}

如果仅仅执行一次,会出现两个问题:

A、如果打开摄像头立即调用拍照保存,第一次会失败,获取不到数据

B、每次拍摄保存的图片是上一次的图片

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值