forked from floratest1/SpireCV
camerabase done
This commit is contained in:
parent
dd3216e19e
commit
a0d3e258d9
|
@ -0,0 +1,79 @@
|
|||
#ifndef __SV_CAMERA__
|
||||
#define __SV_CAMERA__
|
||||
|
||||
#include "opencv2/opencv.hpp"
|
||||
|
||||
namespace sv
|
||||
{
|
||||
|
||||
enum class CameraType : int
|
||||
{
|
||||
// 未知相机
|
||||
NONE = 0X00001000,
|
||||
// 标准opencv框架下的相机
|
||||
WEBCAM = 0X00001001,
|
||||
V4L2CAM = 0X00001002,
|
||||
// 视频文件
|
||||
VIDEOFILE = 0X00002001,
|
||||
// 普通流媒体相机
|
||||
STREAMING = 0X00004001,
|
||||
// 普通的MIPI-CSI相机
|
||||
MIPI = 0X00008001,
|
||||
// 进行了传输优化适配的相机
|
||||
G1 = 0X00010001,
|
||||
Q10 = 0X00010002,
|
||||
GX40 = 0X00010003,
|
||||
MC1 = 0X00010004,
|
||||
// 虚拟的相机设备 主要仿真接入
|
||||
VIRTUAL = 0X00020001,
|
||||
};
|
||||
|
||||
class Camera
|
||||
{
|
||||
private:
|
||||
void *dev;
|
||||
|
||||
public:
|
||||
// 构建时根据相机类型实例化对应的相机类
|
||||
// timeOut: 相机连接超时时间;超过该时间没有读取到新的帧,则认为相机失去连接 单位ms
|
||||
Camera(CameraType type, int timeOut = 500);
|
||||
|
||||
// 基本配置 必须调用下述的一个接口后才能open
|
||||
bool setStream(const std::string &ip, int port);
|
||||
bool setName(const std::string &name);
|
||||
bool setIndex(int index);
|
||||
// 基础功能
|
||||
bool open(void);
|
||||
bool read(cv::Mat &image);
|
||||
bool readNoBlock(cv::Mat &image);
|
||||
void release(void);
|
||||
|
||||
// 属性配置
|
||||
void setWH(int width, int height);
|
||||
void setFps(int fps);
|
||||
void setBrightness(double brightness);
|
||||
void setContrast(double contrast);
|
||||
void setSaturation(double saturation);
|
||||
void setHue(double hue);
|
||||
void setExposure(double exposure);
|
||||
|
||||
// 获取属性
|
||||
bool isActive(void);
|
||||
CameraType getType(void);
|
||||
std::string getName(void);
|
||||
|
||||
int getW(void);
|
||||
int getH(void);
|
||||
int getExpectFps(void);
|
||||
double getFps(void);
|
||||
double getBrightness(void);
|
||||
double getContrast(void);
|
||||
double getSaturation(void);
|
||||
double getHue(void);
|
||||
double getExposure(void);
|
||||
|
||||
~Camera();
|
||||
};
|
||||
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,179 @@
|
|||
#include "sv_camera_privately.h"
|
||||
#include "sv_camera.h"
|
||||
|
||||
#include <map>
|
||||
#include <iterator>
|
||||
|
||||
typedef sv_p::CameraBase *(*cameraCreat)(int timeOut);
|
||||
static std::map<sv::CameraType, cameraCreat> svCameraList =
|
||||
{
|
||||
{sv::CameraType::NONE, nullptr},
|
||||
{sv::CameraType::WEBCAM, nullptr},
|
||||
{sv::CameraType::V4L2CAM, nullptr},
|
||||
{sv::CameraType::VIDEOFILE, nullptr},
|
||||
{sv::CameraType::STREAMING, nullptr},
|
||||
{sv::CameraType::MIPI, nullptr},
|
||||
{sv::CameraType::G1, nullptr},
|
||||
{sv::CameraType::Q10, nullptr},
|
||||
{sv::CameraType::GX40, nullptr},
|
||||
{sv::CameraType::MC1, nullptr},
|
||||
{sv::CameraType::VIRTUAL, nullptr}};
|
||||
|
||||
static sv_p::CameraBase *svCreatCamera(sv::CameraType type, int timeOut)
|
||||
{
|
||||
std::map<sv::CameraType, cameraCreat>::iterator temp = svCameraList.find(type);
|
||||
if (temp != svCameraList.end())
|
||||
{
|
||||
return temp->second(timeOut);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
sv::Camera::Camera(CameraType type, int timeOut)
|
||||
{
|
||||
this->dev = svCreatCamera(type,timeOut);
|
||||
}
|
||||
|
||||
sv::Camera::~Camera()
|
||||
{
|
||||
// 休眠50ms 以便能退出线程
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||
delete (sv_p::CameraBase *)dev;
|
||||
}
|
||||
|
||||
sv_p::CameraBase::~CameraBase()
|
||||
{
|
||||
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
|
||||
readThreadHandle = readThreadHandle == 0 ? 0 : pthread_cancel(readThreadHandle);
|
||||
release();
|
||||
}
|
||||
|
||||
bool sv::Camera::setStream(const std::string &ip, int port)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->setStream(ip, port);
|
||||
}
|
||||
|
||||
bool sv::Camera::setName(const std::string &name)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->setName(name);
|
||||
}
|
||||
|
||||
bool sv::Camera::setIndex(int index)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->setIndex(index);
|
||||
}
|
||||
|
||||
bool sv::Camera::open(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->open();
|
||||
}
|
||||
|
||||
bool sv::Camera::read(cv::Mat &image)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->read(image);
|
||||
}
|
||||
|
||||
bool sv::Camera::readNoBlock(cv::Mat &image)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->readNoBlock(image);
|
||||
}
|
||||
|
||||
void sv::Camera::release(void)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->release();
|
||||
}
|
||||
|
||||
void sv::Camera::setWH(int width, int height)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setWH(width, height);
|
||||
}
|
||||
|
||||
void sv::Camera::setFps(int fps)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setFps(fps);
|
||||
}
|
||||
|
||||
void sv::Camera::setBrightness(double brightness)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setBrightness(brightness);
|
||||
}
|
||||
|
||||
void sv::Camera::setContrast(double contrast)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setContrast(contrast);
|
||||
}
|
||||
|
||||
void sv::Camera::setSaturation(double saturation)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setSaturation(saturation);
|
||||
}
|
||||
|
||||
void sv::Camera::setHue(double hue)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setHue(hue);
|
||||
}
|
||||
|
||||
void sv::Camera::setExposure(double exposure)
|
||||
{
|
||||
((sv_p::CameraBase *)dev)->setExposure(exposure);
|
||||
}
|
||||
|
||||
bool sv::Camera::isActive(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->isActive();
|
||||
}
|
||||
|
||||
sv::CameraType sv::Camera::getType(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getType();
|
||||
}
|
||||
|
||||
std::string sv::Camera::getName(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getName();
|
||||
}
|
||||
|
||||
int sv::Camera::getW(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getW();
|
||||
}
|
||||
|
||||
int sv::Camera::getH(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getH();
|
||||
}
|
||||
|
||||
int sv::Camera::getExpectFps(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getExpectFps();
|
||||
}
|
||||
|
||||
double sv::Camera::getFps(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getFps();
|
||||
}
|
||||
|
||||
double sv::Camera::getBrightness(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getBrightness();
|
||||
}
|
||||
|
||||
double sv::Camera::getContrast(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getContrast();
|
||||
}
|
||||
|
||||
double sv::Camera::getSaturation(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getSaturation();
|
||||
}
|
||||
|
||||
double sv::Camera::getHue(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getHue();
|
||||
}
|
||||
|
||||
double sv::Camera::getExposure(void)
|
||||
{
|
||||
return ((sv_p::CameraBase *)dev)->getExposure();
|
||||
}
|
|
@ -0,0 +1,136 @@
|
|||
#include "sv_camera_privately.h"
|
||||
|
||||
sv_p::CameraBase::CameraBase(int timeOut)
|
||||
{
|
||||
this->_timeOut = timeOut;
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::readThread(void)
|
||||
{
|
||||
int count = 0;
|
||||
while (this->cap.isOpened())
|
||||
{
|
||||
if (this->cap.grab())
|
||||
{
|
||||
std::lock_guard<std::mutex> locker(this->frameMutex);
|
||||
this->cap.retrieve(this->imageBuff);
|
||||
this->frameEmpty.notify_all();
|
||||
count = 0;
|
||||
isGot = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
count++;
|
||||
if (count > this->_timeOut)
|
||||
{
|
||||
this->cap.release();
|
||||
// 抛出异常 并返回
|
||||
throw std::runtime_error("SpireCV (101) Camera has offline, check CAMERA!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||
}
|
||||
}
|
||||
|
||||
#define PARAM_SET_CHECK(param, value) param = (value > 0 ? value : param)
|
||||
|
||||
void sv_p::CameraBase::setWH(int width, int height)
|
||||
{
|
||||
if (!this->cap.isOpened())
|
||||
{
|
||||
PARAM_SET_CHECK(this->_width, width);
|
||||
PARAM_SET_CHECK(this->_height, height);
|
||||
}
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::setFps(int fps)
|
||||
{
|
||||
PARAM_SET_CHECK(this->_fps, fps);
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.set(cv::CAP_PROP_FPS, fps);
|
||||
}
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::setBrightness(double brightness)
|
||||
{
|
||||
PARAM_SET_CHECK(this->_brightness, brightness);
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.set(cv::CAP_PROP_BRIGHTNESS, brightness);
|
||||
}
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::setContrast(double contrast)
|
||||
{
|
||||
PARAM_SET_CHECK(this->_contrast, contrast);
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.set(cv::CAP_PROP_CONTRAST, contrast);
|
||||
}
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::setSaturation(double saturation)
|
||||
{
|
||||
PARAM_SET_CHECK(this->_saturation, saturation);
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.set(cv::CAP_PROP_SATURATION, saturation);
|
||||
}
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::setHue(double hue)
|
||||
{
|
||||
PARAM_SET_CHECK(this->_hue, hue);
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.set(cv::CAP_PROP_HUE, hue);
|
||||
}
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::setExposure(double exposure)
|
||||
{
|
||||
PARAM_SET_CHECK(this->_exposure, exposure);
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.set(cv::CAP_PROP_EXPOSURE, exposure);
|
||||
}
|
||||
}
|
||||
|
||||
bool sv_p::CameraBase::open(void)
|
||||
{
|
||||
}
|
||||
|
||||
bool sv_p::CameraBase::read(cv::Mat &image)
|
||||
{
|
||||
bool ret = false;
|
||||
std::lock_guard<std::mutex> locker(this->frameMutex);
|
||||
if (this->frameEmpty.wait_for(this->frameMutex, std::chrono::milliseconds(this->_timeOut)) == std::cv_status::no_timeout)
|
||||
{
|
||||
// 获取图像
|
||||
this->imageBuff.copyTo(image);
|
||||
ret = true;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool sv_p::CameraBase::readNoBlock(cv::Mat &image)
|
||||
{
|
||||
bool ret = false;
|
||||
std::lock_guard<std::mutex> locker(this->frameMutex);
|
||||
if (this->isGot)
|
||||
{
|
||||
this->imageBuff.copyTo(image);
|
||||
isGot = false;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void sv_p::CameraBase::release(void)
|
||||
{
|
||||
if (this->cap.isOpened())
|
||||
{
|
||||
this->cap.release();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
#ifndef __SV_CAMERA_PRIVATELY__
|
||||
#define __SV_CAMERA_PRIVATELY__
|
||||
|
||||
#include "opencv2/opencv.hpp"
|
||||
#include <stdint.h>
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include "sv_camera.h"
|
||||
|
||||
namespace sv_p
|
||||
{
|
||||
|
||||
class CameraBase
|
||||
{
|
||||
private:
|
||||
// 图像的属性
|
||||
int _width = 1280;
|
||||
int _height = 720;
|
||||
int _fps = 30;
|
||||
|
||||
double _brightness = -1;
|
||||
double _contrast = -1;
|
||||
double _saturation = -1;
|
||||
double _hue = -1;
|
||||
double _exposure = -1;
|
||||
|
||||
int _timeOut = 500;
|
||||
// 内部状态
|
||||
double fpsCurr = -1;
|
||||
bool isGot = false;
|
||||
// 内部变量
|
||||
cv::Mat imageBuff;
|
||||
cv::VideoCapture cap;
|
||||
std::mutex frameMutex;
|
||||
std::condition_variable_any frameEmpty;
|
||||
std::thread::native_handle_type readThreadHandle = 0;
|
||||
|
||||
// 获取图像的线程 在这个线程中查询、提取图像
|
||||
virtual void readThread(void);
|
||||
|
||||
public:
|
||||
// 属性设置的接口
|
||||
virtual void setWH(int width, int height);
|
||||
// 基本属性 至少实现1个
|
||||
virtual bool setStream(const std::string &ip, uint16_t port) { return false; }
|
||||
virtual bool setName(const std::string &name) { return false; }
|
||||
virtual bool setIndex(int index) { return false; }
|
||||
|
||||
// 扩展属性设置 默认调用opencv的实现
|
||||
virtual void setFps(int fps);
|
||||
virtual void setBrightness(double brightness);
|
||||
virtual void setContrast(double contrast);
|
||||
virtual void setSaturation(double saturation);
|
||||
virtual void setHue(double hue);
|
||||
virtual void setExposure(double exposure);
|
||||
|
||||
// 属性获取的接口
|
||||
virtual sv::CameraType getType(void) { return sv::CameraType::NONE; }
|
||||
virtual std::string getName(void) { return "\0"; };
|
||||
|
||||
virtual bool isActive(void) { return (readThreadHandle == 0 ? false : true); }
|
||||
int getW(void) { return _width; }
|
||||
int getH(void) { return _height; }
|
||||
int getExpectFps(void) { return _fps; }
|
||||
double getFps(void) { return fpsCurr; }
|
||||
double getBrightness(void) { return _brightness; }
|
||||
double getContrast(void) { return _contrast; }
|
||||
double getSaturation(void) { return _saturation; }
|
||||
double getHue(void) { return _hue; }
|
||||
double getExposure(void) { return _exposure; }
|
||||
|
||||
// 功能接口函数
|
||||
virtual bool open(void);
|
||||
virtual bool read(cv::Mat &image);
|
||||
virtual bool readNoBlock(cv::Mat &image);
|
||||
virtual void release(void);
|
||||
|
||||
CameraBase(int timeOut);
|
||||
~CameraBase();
|
||||
};
|
||||
|
||||
}
|
||||
#endif
|
Loading…
Reference in New Issue