-
Notifications
You must be signed in to change notification settings - Fork 0
4. 自定义相机
Lin Yicheng edited this page Nov 21, 2024
·
1 revision
如果使用的相机型号不是指定厂商的,那么需要自己进行一定的编程,如果需要我们协助支持,请私信或者提出相关的issue。在demo/CustomisedCamera
文件夹下有一个示例代码,可以参考这个示例代码进行开发。
这里简单介绍一下开发步骤:
- 新建头文件和源文件,例如
customised_camera.h
和customised_camera.cpp
。 - 在头文件中定义一个类,例如
CustCamManger
,定义如下的接口函数
#pragma once
#include <vector>
#include <thread>
class CustCamManger {
public:
static CustCamManger& GetInstance() {
static CustCamManger instance;
return instance;
}
CustCamManger(const CustCamManger&) = delete;
CustCamManger& operator=(const CustCamManger&) = delete;
// 初始化相机函数
bool Initialization();
// 停止相机读取线程函数
void Stop();
// 开始相机读取线程函数
void Start();
// 启用相机函数
void Enable() { is_running_ = true; }
// 禁用相机函数
void Disable() { is_running_ = false; }
// 相机线程,读取相机数据
void Receive(const std::string&) const;
private:
CustCamManger();
~CustCamManger();
// 相机线程向量,一个相机一个线程读取
std::vector<std::thread> cam_threads_;
// 是否正在运行标志位
bool is_running_{false};
};
- 在源文件中实现这些函数,其中关键点在于实现如下几个关键部分:
- 初始化相机线程,一个相机一个线程
- 结束相机线程,关闭相机
- 相机读取线程函数,读取相机图像数据,曝光数据,计算时间戳,存入DataManger
如下是一个示例代码:
// 根据相机数量,构造对应数量的线程,读取相机
void CustCamManger::Start() {
// 假设有两个相机
const std::string cam1 = "cam1";
const std::string cam2 = "cam2";
cam_threads_.emplace_back(&CustCamManger::Receive, this, cam1);
cam_threads_.emplace_back(&CustCamManger::Receive, this, cam2);
Enable();
}
void CustCamManger::Stop() {
// 1. 关闭相机线程
Disable();
std::this_thread::sleep_for(std::chrono::milliseconds{500});
for (auto &cam_thread : cam_threads_) {
while (cam_thread.joinable()) {
cam_thread.join();
}
}
cam_threads_.clear();
cam_threads_.shrink_to_fit();
// 2. 关闭相机, 自定义相机关闭
}
// 相机读取线程函数
void CustCamManger::Receive(const std::string &name) const {
ImgData img_data;
while (is_running_) {
// 1. 自定义相机获取图像数据
// 2. 将图像数据存入img_data TODO
// 3. 自定义相机获取曝光时间
float expose_time_us = 0;
// 4. 将曝光时间存入img_data t = t_trigger + t_expose / 2
img_data.time_stamp_us = DataManger::GetInstance().GetLastTiggerTime() + static_cast<uint64_t>(expose_time_us / 2.);
// 5. 设置相机名字
img_data.camera_name = name;
// 6. 将img_data存入DataManger
DataManger::GetInstance().AddCamData(name, img_data);
std::this_thread::sleep_for(std::chrono::milliseconds{10});
}
}