From aca1f8b183f1ab625bfbd09364aa30a5a3ae26e2 Mon Sep 17 00:00:00 2001 From: John Zhao Date: Sun, 13 May 2018 10:12:24 +0800 Subject: [PATCH] Done control tutorials --- samples/tutorials/CMakeLists.txt | 9 ++ samples/tutorials/control/auto_exposure.cc | 69 +++++++++++++++ samples/tutorials/control/framerate.cc | 90 ++++++++++++++++++++ samples/tutorials/control/infrared.cc | 2 +- samples/tutorials/control/manual_exposure.cc | 67 +++++++++++++++ 5 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 samples/tutorials/control/auto_exposure.cc create mode 100644 samples/tutorials/control/framerate.cc create mode 100644 samples/tutorials/control/manual_exposure.cc diff --git a/samples/tutorials/CMakeLists.txt b/samples/tutorials/CMakeLists.txt index dc94d6e..b5a7c97 100644 --- a/samples/tutorials/CMakeLists.txt +++ b/samples/tutorials/CMakeLists.txt @@ -111,6 +111,15 @@ make_executable2(get_with_plugin SRCS data/get_with_plugin.cc WITH_OPENCV) # control +make_executable2(ctrl_framerate SRCS control/framerate.cc WITH_OPENCV) +make_executable2(ctrl_auto_exposure + SRCS control/auto_exposure.cc util/cv_painter.cc + WITH_OPENCV +) +make_executable2(ctrl_manual_exposure + SRCS control/manual_exposure.cc util/cv_painter.cc + WITH_OPENCV +) make_executable2(ctrl_infrared SRCS control/infrared.cc WITH_OPENCV) endif() diff --git a/samples/tutorials/control/auto_exposure.cc b/samples/tutorials/control/auto_exposure.cc new file mode 100644 index 0000000..f030eae --- /dev/null +++ b/samples/tutorials/control/auto_exposure.cc @@ -0,0 +1,69 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include + +#include + +#include "mynteye/api.h" + +#include "util/cv_painter.h" + +MYNTEYE_USE_NAMESPACE + +int main(int argc, char *argv[]) { + auto &&api = API::Create(argc, argv); + + // auto-exposure: 0 + api->SetOptionValue(Option::EXPOSURE_MODE, 0); + + // max_gain: range [0.48], default 48 + api->SetOptionValue(Option::MAX_GAIN, 48); + // max_exposure_time: range [0,240], default 240 + api->SetOptionValue(Option::MAX_EXPOSURE_TIME, 240); + // desired_brightness: range [0,255], default 192 + api->SetOptionValue(Option::DESIRED_BRIGHTNESS, 192); + + LOG(INFO) << "Enable auto-exposure"; + LOG(INFO) << "Set MAX_GAIN to " << api->GetOptionValue(Option::MAX_GAIN); + LOG(INFO) << "Set MAX_EXPOSURE_TIME to " + << api->GetOptionValue(Option::MAX_EXPOSURE_TIME); + LOG(INFO) << "Set DESIRED_BRIGHTNESS to " + << api->GetOptionValue(Option::DESIRED_BRIGHTNESS); + + api->Start(Source::VIDEO_STREAMING); + + CVPainter painter; + + cv::namedWindow("frame"); + + while (true) { + api->WaitForStreams(); + + auto &&left_data = api->GetStreamData(Stream::LEFT); + auto &&right_data = api->GetStreamData(Stream::RIGHT); + + cv::Mat img; + cv::hconcat(left_data.frame, right_data.frame, img); + painter.DrawImgData(img, *left_data.img); + cv::imshow("frame", img); + + char key = static_cast(cv::waitKey(1)); + if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q + break; + } + } + + api->Stop(Source::VIDEO_STREAMING); + return 0; +} diff --git a/samples/tutorials/control/framerate.cc b/samples/tutorials/control/framerate.cc new file mode 100644 index 0000000..882fa1f --- /dev/null +++ b/samples/tutorials/control/framerate.cc @@ -0,0 +1,90 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include + +#include + +#include + +#include "mynteye/api.h" +#include "mynteye/times.h" + +MYNTEYE_USE_NAMESPACE + +int main(int argc, char *argv[]) { + auto &&api = API::Create(argc, argv); + + // Attention: must set FRAME_RATE and IMU_FREQUENCY together, otherwise won't + // succeed. + + // FRAME_RATE values: 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 + api->SetOptionValue(Option::FRAME_RATE, 25); + // IMU_FREQUENCY values: 100, 200, 250, 333, 500 + api->SetOptionValue(Option::IMU_FREQUENCY, 500); + + LOG(INFO) << "Set FRAME_RATE to " << api->GetOptionValue(Option::FRAME_RATE); + LOG(INFO) << "Set IMU_FREQUENCY to " + << api->GetOptionValue(Option::IMU_FREQUENCY); + + // Count img + std::atomic_uint img_count(0); + api->SetStreamCallback( + Stream::LEFT, [&img_count](const api::StreamData &data) { + CHECK_NOTNULL(data.img); + ++img_count; + }); + + // Count imu + std::atomic_uint imu_count(0); + api->SetMotionCallback([&imu_count](const api::MotionData &data) { + CHECK_NOTNULL(data.imu); + ++imu_count; + }); + + api->Start(Source::ALL); + + cv::namedWindow("frame"); + + auto &&time_beg = times::now(); + while (true) { + api->WaitForStreams(); + + auto &&left_data = api->GetStreamData(Stream::LEFT); + auto &&right_data = api->GetStreamData(Stream::RIGHT); + + cv::Mat img; + cv::hconcat(left_data.frame, right_data.frame, img); + cv::imshow("frame", img); + + char key = static_cast(cv::waitKey(1)); + if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q + break; + } + } + auto &&time_end = times::now(); + + api->Stop(Source::ALL); + + // Calculate img fps and imu hz + float elapsed_ms = + times::count(time_end - time_beg) * 0.001f; + LOG(INFO) << "Time beg: " << times::to_local_string(time_beg) + << ", end: " << times::to_local_string(time_end) + << ", cost: " << elapsed_ms << "ms"; + LOG(INFO) << "Img count: " << img_count + << ", fps: " << (1000.f * img_count / elapsed_ms); + LOG(INFO) << "Imu count: " << imu_count + << ", hz: " << (1000.f * imu_count / elapsed_ms); + return 0; +} diff --git a/samples/tutorials/control/infrared.cc b/samples/tutorials/control/infrared.cc index b44551b..da0e12b 100644 --- a/samples/tutorials/control/infrared.cc +++ b/samples/tutorials/control/infrared.cc @@ -55,6 +55,6 @@ int main(int argc, char *argv[]) { } } - api->Stop(Source::ALL); + api->Stop(Source::VIDEO_STREAMING); return 0; } diff --git a/samples/tutorials/control/manual_exposure.cc b/samples/tutorials/control/manual_exposure.cc new file mode 100644 index 0000000..eab481b --- /dev/null +++ b/samples/tutorials/control/manual_exposure.cc @@ -0,0 +1,67 @@ +// Copyright 2018 Slightech Co., Ltd. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include + +#include + +#include "mynteye/api.h" + +#include "util/cv_painter.h" + +MYNTEYE_USE_NAMESPACE + +int main(int argc, char *argv[]) { + auto &&api = API::Create(argc, argv); + + // manual-exposure: 1 + api->SetOptionValue(Option::EXPOSURE_MODE, 1); + + // gain: range [0.48], default 24 + api->SetOptionValue(Option::GAIN, 24); + // brightness/exposure_time: range [0,240], default 120 + api->SetOptionValue(Option::BRIGHTNESS, 120); + // contrast/black_level_calibration: range [0,255], default 127 + api->SetOptionValue(Option::CONTRAST, 127); + + LOG(INFO) << "Enable manual-exposure"; + LOG(INFO) << "Set GAIN to " << api->GetOptionValue(Option::GAIN); + LOG(INFO) << "Set BRIGHTNESS to " << api->GetOptionValue(Option::BRIGHTNESS); + LOG(INFO) << "Set CONTRAST to " << api->GetOptionValue(Option::CONTRAST); + + api->Start(Source::VIDEO_STREAMING); + + CVPainter painter; + + cv::namedWindow("frame"); + + while (true) { + api->WaitForStreams(); + + auto &&left_data = api->GetStreamData(Stream::LEFT); + auto &&right_data = api->GetStreamData(Stream::RIGHT); + + cv::Mat img; + cv::hconcat(left_data.frame, right_data.frame, img); + painter.DrawImgData(img, *left_data.img); + cv::imshow("frame", img); + + char key = static_cast(cv::waitKey(1)); + if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q + break; + } + } + + api->Stop(Source::VIDEO_STREAMING); + return 0; +}