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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cmd跑绿色代码_cmd装逼代码-cmd命令,装逼

    cmd跑绿色代码_cmd装逼代码-cmd命令,装逼本教程分享:《cmd装逼代码》如何使用命令提示符装逼事先声明,如果你不知道打开windows的命令行工具,我是绝对不会告诉你是用windows+R,然后键入cmd打开的windows自带的命令行工具很强大,毕竟计算机一开始都是以键入命令的方式来操作的,但现如今计算机的发展,许多在过去需要去记大量命令才能完成的操作,现如今通过傻瓜式的点选都可以完成。作为一名有逼格的程序员,在计算机如今图形界面…

    2022年6月5日
    56
  • linux配置ipv6静态路由,IPv6静态路由配置

    linux配置ipv6静态路由,IPv6静态路由配置IPv6 静态路由命令 R1 config ipv6unicast routing 启用 IPv6 路由 R1 config if ipv6address2 1111 1 64 手工配置 IPv6 地址 R1 config if ipv6address2 1111 1 64eui 64 自动配置 IPv6 地址 R1 config ipv6route200 2323 6

    2025年9月14日
    2
  • MODIS数据介绍

    MODIS数据介绍转自:http://blog.sina.com.cn/s/blog_53e9bb570101jv55.html一、Modis数据资源总体介绍&nbsp;1999年2月18日,美国成功地发射了地球观测系统(EOS)的第一颗先进的极地轨道环境遥感卫星Terra。它的主要目标是实现…

    2022年5月7日
    73
  • 魔兽世界 | 宏命令教程

    魔兽世界 | 宏命令教程前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、什么是宏命令有了宏命令,可以很大程度的解放双手,开启懒人脸滚键盘模式,本篇文章就简单讲解一下基本宏指令,并尝试完成一套一件输出宏二、基本宏速查表#showtooltip多用于宏命令的开头,让按钮显示技能的说明和技能的图标/castxxx施放技能,如/

    2025年8月3日
    4
  • Java7 新特性 —— java.nio.file 文件操作

    Java7 新特性 —— java.nio.file 文件操作

    2020年11月19日
    146

发表回复

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

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