#include <iomanip>
#include <iostream>
#include <mutex>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "camera.h"
#include "utility.h"
namespace {
//原图像
class GrabCallbacks {
public:
GrabCallbacks()
: tick_beg_(0),
fps_(0),
count_(0) {
//记录开始执行时的周期数
tick_beg_ = static_cast<double>(cv::getTickCount());
}
~GrabCallbacks() = default;
void OnPre() {}
void OnPost(cv::Mat &left, cv::Mat &right) {
std::lock_guard<std::mutex> lk(mtx_);//在构造时加锁,析构时自动解锁
//计算程序运行的时间
double elapsed = (static_cast<double>(cv::getTickCount()) - tick_beg_) / cv::getTickFrequency();
++count_;//画面数
fps_ = count_ / elapsed;//每秒传输画面数
}
double GetFPS() {
std::lock_guard<std::mutex> lk(mtx_);
return fps_;//获得画面频率值
}
std::uint64_t GetCount() {
std::lock_guard<std::mutex> lk(mtx_);
return count_;//获得画面数
}
private:
double tick_beg_;//开始时周期数
double fps_;//画面频率
std::uint64_t count_;//画面数
std::mutex mtx_;
};
//深度图像
class DepthMapCallbacks {
public:
DepthMapCallbacks()
: tick_beg_(0),
tick_end_(0),
time_cost_(0),
time_total_(0),
count_(0) {
}
~DepthMapCallbacks() = default;
void OnPre(cv::Mat &left, cv::Mat &right) {
{
std::lock_guard<std::mutex> lk(mtx_);
tick_beg_ = static_cast<double>(cv::getTickCount());//获得当前时刻周期数
}
}
void OnPost(cv::Mat &depthmap) {
{
std::lock_guard<std::mutex> lk(mtx_);
tick_end_ = static_cast<double>(cv::getTickCount());
time_cost_ = (tick_end_ - tick_beg_) / cv::getTickFrequency();//一幅图花费的时间
time_total_ += time_cost_;//所以图片总时间
++count_;
}
}
double GetTimeCost() {
std::lock_guard<std::mutex> lk(mtx_);
return time_cost_;//获得一幅图时间值
}
double GetTimeAverage() {
std::lock_guard<std::mutex> lk(mtx_);
return time_total_ / count_;//获得每幅图时间平均值
}
std::uint64_t GetCount() {
std::lock_guard<std::mutex> lk(mtx_);
return count_;//图片数
}
private:
double tick_beg_;//开始时间
double tick_end_;//结束时间
double time_cost_; // in seconds,单幅图花费时间
double time_total_; // in seconds,所以图花费总时间
std::uint64_t count_;//图片数
std::mutex mtx_;
};
//获得fmt对象
std::unique_ptr<std::ios> GetStreamFormat(int wide, int prec, char fillch = ' ') {
auto fmt = std::unique_ptr<std::ios>{new std::ios{nullptr}};//fmt为unique_ptr<std::ios>类的对象
fmt->setf(std::ios::fixed);
fmt->width(std::move(wide));//宽度
fmt->precision(std::move(prec));//精度
fmt->fill(std::move(fillch));//填充
return fmt;
}
//获得ss对象
template<typename T>
std::stringstream &Append(std::stringstream &ss, T text,
std::ios *fmt = nullptr, bool reset = false) {
if (reset) {
ss.str("");
ss.clear();//ss里面内容清空
}
if (fmt) {
ss.copyfmt(*fmt);//将fmt的所有内部成员的值(状态标志和关联的流缓冲区除外)复制到 *ss 的相应成员。
}
ss << std::move(text);//text的值移动到ss中
retur
小觅双目MYNT EYE SDK 中的camera3程序详解
最新推荐文章于 2021-01-14 10:44:55 发布