基于VideoInput的摄像头操作类

这段时间做毕设,项目与摄像头采集图像相关,记录于此备忘。

因为设备采用的是比较旧的USB视频采集卡,所以只能使用videoInput进行操作,于是写了一个Camera类。

Camera.h:

#pragma once

#ifndef CAMERA_H
#define CAMERA_H

#include "stdafx.h"
#include "videoInput.h"

// 添加静态库
#pragma comment(lib, "videoInput.lib")

class Camera
{
private:
	videoInput* m_VI;
	int m_deviceID;
	int m_camera_height;
	int m_camera_width;

public:
	Camera(){};
	Camera(int deviceID);
	~Camera(){};
	bool open();
	bool close();
	bool query_one_frame(IplImage** img);
	int get_height();
	int get_width();
};

#endif



Camera.cpp:

#include "stdafx.h"
#include "Camera.h"

Camera::Camera(int deviceID)
{
	m_deviceID = deviceID;
}

// 打开摄像头
bool Camera::open()
{
	m_VI = new videoInput();
	m_VI->setupDevice(m_deviceID);      // 启动设备
	m_VI->setFormat(m_deviceID, VI_SECAM_D);	// 设置摄像头的格式

	m_camera_height = m_VI->getHeight(m_deviceID); // 获取图像高度
	m_camera_width = m_VI->getWidth(m_deviceID); // 获取图像宽度

	if(false == m_VI->isDeviceSetup(m_deviceID))
	{
		AfxMessageBox(_T("无法获取摄像头!"));
		return false;
	}
	return true;
}

// 获取一帧图像,出参为img
bool Camera::query_one_frame(IplImage** img)
{
	if(NULL == m_VI)
		return false;
	*img = cvCreateImage(cvSize(m_camera_width, m_camera_height),8,3);
	m_VI->getPixels(m_deviceID,(unsigned char*)(*img)->imageData,false,true);
	// 中值滤波
	cvSmooth(*img, *img, CV_MEDIAN);
	return true;
}

// 关闭摄像头
bool Camera::close()
{
	if(NULL == m_VI)
		return false;

	m_VI->stopDevice(m_deviceID);
	m_VI = NULL;
	return true;
}

// 获取图像高度
int Camera::get_height()
{
	return m_camera_height;
}

// 获取图像宽度
int Camera::get_width()
{
	return m_camera_width;
}

videoInput下载戳这里。


转载注明出处。

你可能感兴趣的:(代码)