OpenCv调用摄像头拍照代码

OpenCv调用摄像头拍照代码

大家好,又见面了,我是全栈君。

近期在研究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、每次拍摄保存的图片是上一次的图片

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116310.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java的三个开发平台分别是什么_入门金笔推荐

    java的三个开发平台分别是什么_入门金笔推荐**Java开发入门**废话不多说,我今天主要讲的是Sun公司将Java划分的三个技术平台,他们分别是JavaSe、JavaEE、JavaME,接下来针对这三个平台分别进行详细介绍。JavaSE(JavaPlatformStandardEdition)标准版,是为开发普通桌面和商务应用程序提供的解决方案。JavaSE平台包括了java最核心的部分,JavaEE和Java…

    2022年8月23日
    5
  • 【STM32】NVIC中断优先级管理(中断向量表)

    【STM32】NVIC中断优先级管理(中断向量表)STM32F1xx官方资料:《STM32中文参考手册V10》-第9章中断和事件Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F10…

    2022年5月28日
    287
  • graylog2(v2.0.3)的安装与配置

    graylog2(v2.0.3)的安装与配置

    2021年8月30日
    61
  • 解压war包和重新压缩war包[通俗易懂]

    解压war包和重新压缩war包[通俗易懂]publicclassWarUtils{ /** *解压war包 *@paramunWarPathwar解压的路径 *@paramwarFile解压的war包文件 */ publicstaticvoidunWar(StringunWarPath,FilewarFile){ try{ //读取文件流 Buffered

    2022年9月28日
    2
  • Try catch如何使用[通俗易懂]

    Try catch如何使用[通俗易懂]trycatch适用场合:一、兼容性浏览器的兼容性是程序员很头痛的事儿,往往一些出错会让我们查找许久,在使用trycatch能更好的解决兼容性出错的问题:由于不同浏览器报错提示也不尽相同,通过使用trycatch捕获的浏览器的报错提示,来判断用户使用的浏览器,然后做出对应的解决方法;那么,你如果用if,就只能反馈真或假,而不能直接抛出浏览器的报错内容。二、防止阻塞trycatch用…

    2022年6月20日
    44
  • DropDownList绑定数据库「建议收藏」

    DropDownList绑定数据库「建议收藏」//获取文本this.DropDownList1.SelectedItem.Text;本类内使用protectedvoidPage_Load(objectsender,EventArgse)   {       this.DropDownList1.Items.Clear();       this.DropDownList1.DataSource=DbHelperSQL.Query(“select*fromauthors”).Tables[0];       this.Drop

    2022年10月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号