all_stream 示例演示了 Xvisio 设备和对应 SDK API 的所有基本功能,提供了执行功能对应的示例代码。
cp -r /usr/share/xvsdk/all_stream <path_to_work>
cd <path_to_work>/all_stream
mkdir build
cd build
cmake ..
make
lsusb
./all_stream
版本 | cmake 命令 |
---|---|
VS2019 64位 | cmake -G "Visual Studio 16 2019" -A x64 |
VS2019 32位 | cmake -G "Visual Studio 16 2019" -A Win32 |
VS2017 64位 | cmake -G "Visual Studio 15 2017" -A x64 |
VS2017 32位 | cmake -G "Visual Studio 15 2017" -A Win32 |
./all_stream.exe
平台 | 目录 |
---|---|
Windows | 安装目录下 samples\all_stream 目录,例如:C:\Program Files\xvsdk\samples\all_stream\ |
Linux/Ubuntu | /usr/share/xvsdk/all_stream/ |
文件 | 描述 |
---|---|
all_stream.cpp | all_stream 主要文件 |
fps_count.hpp | 计算帧率的类实现文件 |
raw2opencv.cpp | 依赖的opencv实现文件 |
CMakeLists.txt | Cmake 工程文件(Android 平台无效) |
all_stream 文件 main(....) 函数为入口函数:
int main( int argc, char* argv[] ) try
enableDevMap控制all_stream需要启用的功能:
static std::map<std::string,int> enableDevMap;
enableDevMap["rgb"] = true;
enableDevMap["tof"]= true;
enableDevMap["fisheye"] = true;
enableDevMap["sgbm"] = true;
enableDevMap["slam"] = true;
enableDevMap["slam_edge"] = true;
enableDevMap["imu"] = true;
enableDevMap["eyetracking"] = true;
enableDevMap["sync"] = false;
enableDevMap["dewarp"] = true;
enableDevMap["VGA"] = true;
enableDevMap["720P"] = false;
enableDevMap["tof_mode"] = 3;//default lablize sf
enableDevMap["tof_point_cloud"] = false;
enableDevMap["log"]=true;
enableDevMap["ir"]=true;
可以通过调整运行时参数来设置设备描述信息,控制启动或关闭某项功能,详细描述见第4节( 字符控制描述):
if (argc >1 && *argv[1]!='\0') {
std::ifstream ifs( argv[1] );
if( !ifs.is_open() ){
std::cerr << "Failed to open: " << argv[1] << std::endl;
}
else
{
std::stringstream fbuf;
fbuf << ifs.rdbuf();
json = fbuf.str();
}
}
if (argc == 3)
{
std::string enableDevStr(argv[2]);
enableDevStr+=" ";
int index,index2;
while(true)
{
index = enableDevStr.find(' ');
if(index == std::string::npos)
{
break;
}
auto one = enableDevStr.substr(0,index);
index2 = one.find('':'');
auto key = one.substr(0,index2);
auto value = one.substr(index2+1,one.size()-index2-1)=="1"true:false;
enableDevStr = enableDevStr.substr(index+1);
std::cout<<key<<" : "<<value<<std::endl;
enableDevMap[key] = value;
}
}
使用样例:
./all_stream test.json "rgb:0 tof:1 tof_mode:3"
all_stream中的while循环来等待需要输入的控制指令,详细描述见第4节( 字符控制描述):
while(true)
{
if(res == xv::FisheyeCamerasEx::ResolutionMode::MEDIUM)
std::cerr << "ENTER 'f' to switch FE to HIGH res" << std::endl;
else
std::cerr << "ENTER 'f' to switch FE to MEDIUM res" << std::endl;
if(sgbm_ctl == true){
std::cerr << "ENTER 's' to stop SGBM to res" << std::endl;
std::cerr << "ENTER 'r' to modify SGBM resolution" << std::endl;
}
else{
std::cerr << "ENTER 's' to start SGBM to res" << std::endl;
}
std::cerr << "ENTER 'q' to exit" << std::endl;
std::cin >> getkey;
//getkey = std::cin.get();
if(getkey == "f")
{
res = (res == xv::FisheyeCamerasEx::ResolutionMode::MEDIUM)?(xv::FisheyeCamerasEx::ResolutionMode::HIGH):(xv::FisheyeCamerasEx::ResolutionMode::MEDIUM);
std::cout<<"device->fisheyeCameras())->setResolutionMode:"<<static_cast<int>(res)<<std::endl;
std::dynamic_pointer_cast<xv::FisheyeCamerasEx>(device->fisheyeCameras())->setResolutionMode(res);
}
else if(getkey == "s")
{
if(sgbm_ctl == false)
{
std::cout<<"device->sgbmCamera()->start(global_config)"<<static_cast<int>(res)<<std::endl;
device->sgbmCamera()->start(global_config);
}
else
{
std::cout<<"device->sgbmCamera()->stop()"<<static_cast<int>(res)<<std::endl;
device->sgbmCamera()->stop();
}
sgbm_ctl = !sgbm_ctl;
}
else if(getkey == "r")
{
sgbmres = (sgbmres == xv::SgbmCamera::Resolution::SGBM_640x480) ? xv::SgbmCamera::Resolution::SGBM_1280x720 : xv::SgbmCamera::Resolution::SGBM_640x480;
bool ret = device->sgbmCamera()->setSgbmResolution(sgbmres);
if(ret){
std::cout << "device->sgbmCamera()->setSgbmResolution: " << static_cast<int>(res)<<std::endl;
}else{
std::cout << "device->sgbmCamera()->setSgbmResolution failed"<<std::endl;
}
}
else if(getkey == "q")
{
break;
}
}
all_stream中的各个图像均是由OpenCV绘制,在代码中通过不同的重载函数raw_to_opencv处理不同的数据,从而绘制对应的图像。
通过OpenCV绘制Fisheye数据:
cv::Mat left;
cv::Mat right;
if (stereo) {
auto const& leftInput = stereo->images[0];
auto const& rightInput = stereo->images[1];
if( leftInput.data != nullptr ){
left = cv::Mat::zeros(leftInput.height, leftInput.width, CV_8UC1);
std::memcpy(left.data, leftInput.data.get(), static_cast<size_t>(left.rowsleft.cols));
}
if( rightInput.data != nullptr ){
right = cv::Mat::zeros(rightInput.height, rightInput.width, CV_8UC1);
std::memcpy(right.data, rightInput.data.get(), static_cast<size_t>(right.rowsright.cols));
}
} else {
left = cv::Mat::zeros(400, 640, CV_8UC1);
right = cv::Mat::zeros(400, 640, CV_8UC1);
}
cv::cvtColor(left, left, cv::COLOR_GRAY2BGR);
cv::cvtColor(right, right, cv::COLOR_GRAY2BGR);
根据特征点绘制线条:
if (keypoints) {
const int size = 2;
int s=0;
for(unsigned int i=0; idescriptors[s].size; i++ ){
auto p = keypoints->descriptors[s].keypoints.get() + i*2;
cv::Point pt(*p, (p+1));
cv::line(left, pt - cv::Point(size,0), pt + cv::Point(size,0), cv::Scalar(0,0,255) );
cv::line(left, pt - cv::Point(0,size), pt + cv::Point(0,size), cv::Scalar(0,0,255) );
}
s=1;
for(unsigned int i=0; idescriptors[s].size; i++ ){ 2;
auto p = keypoints->descriptors[s].keypoints.get() + i
cv::Point pt(*p, *(p+1));
cv::line(right, pt - cv::Point(size,0), pt + cv::Point(size,0), cv::Scalar(0,0,255) );
cv::line(right, pt - cv::Point(0,size), pt + cv::Point(0,size), cv::Scalar(0,0,255) );
}
}
在all_stream启动时,可以通过设置运行时参数来设控制启动或关闭某项功能,具体描述如下:
设置参数 | 默认值 | 备注 |
---|---|---|
rgb | true | 调整该参数决定是否开启rgb |
tof | true | 调整该参数决定是否开启tof |
fisheye | true | 调整该参数决定是否开启fisheye |
sgbm | true | 调整该参数决定是否开启sgbm |
slam | true | 调整该参数决定是否开启slam |
slam_edge | true | 调整该参数决定是否开启Edge模式,如果为false则设置为Mixed模式 |
imu | true | 调整该参数决定是否开启imu |
eyetracking | true | 调整该参数决定是否开启eyetracking(眼控)功能 |
sync | false | 调整该参数决定是否开启同步模式,默认为不开启 |
dewarp | true | 调整该参数决定是否开启图像畸变,默认为开启,如果使用平角镜头则可以不设置该参数 |
VGA | true | 调整该参数将fisheye相机分辨率设置为VGA(640*400) |
720P | false | 调整该参数将fisheye相机分辨率设置为720P(1280*720) |
tof_mode | 3 | 调整该参数设置tof模式,IQMIX_DF = 0,IQMIX_SF = 1, LABELIZE_DF = 2,LABELIZE_SF = 3,M2MIX_DF = 4,M2MIX_SF = 5,默认为LABELIZE_SF模式 |
tof_point_cloud | false | 调整该参数决定是否获取tof点云数据,默认不获取 |
log | true | 调整该参数决定是否输出log |
ir | true | 调整该参数决定是否开启Tof IR图像输出 |