Done disparity processor

This commit is contained in:
John Zhao 2018-04-28 13:26:46 +08:00
parent 21f2f91343
commit c176f55af2
4 changed files with 85 additions and 12 deletions

View File

@ -53,11 +53,13 @@ int main(int argc, char *argv[]) {
api->EnableStreamData(Stream::LEFT_RECTIFIED); api->EnableStreamData(Stream::LEFT_RECTIFIED);
api->EnableStreamData(Stream::RIGHT_RECTIFIED); api->EnableStreamData(Stream::RIGHT_RECTIFIED);
api->EnableStreamData(Stream::DISPARITY_NORMALIZED);
// Enable this will cache the motion datas until you get them. // Enable this will cache the motion datas until you get them.
api->EnableMotionDatas(); api->EnableMotionDatas();
api->Start(Source::ALL); api->Start(Source::ALL);
cv::namedWindow("frame"); cv::namedWindow("frame");
cv::namedWindow("disparity");
std::size_t motion_count = 0; std::size_t motion_count = 0;
auto &&time_beg = times::now(); auto &&time_beg = times::now();
@ -68,8 +70,15 @@ int main(int argc, char *argv[]) {
// auto &&right_data = api->GetStreamData(Stream::RIGHT); // auto &&right_data = api->GetStreamData(Stream::RIGHT);
auto &&left_data = api->GetStreamData(Stream::LEFT_RECTIFIED); auto &&left_data = api->GetStreamData(Stream::LEFT_RECTIFIED);
auto &&right_data = api->GetStreamData(Stream::RIGHT_RECTIFIED); auto &&right_data = api->GetStreamData(Stream::RIGHT_RECTIFIED);
if (left_data.frame.empty() || right_data.frame.empty()) { if (!left_data.frame.empty() && !right_data.frame.empty()) {
continue; cv::Mat img;
cv::hconcat(left_data.frame, right_data.frame, img);
cv::imshow("frame", img);
}
auto &&disp_data = api->GetStreamData(Stream::DISPARITY_NORMALIZED);
if (!disp_data.frame.empty()) {
cv::imshow("disparity", disp_data.frame);
} }
auto &&motion_datas = api->GetMotionDatas(); auto &&motion_datas = api->GetMotionDatas();
@ -86,10 +95,6 @@ int main(int argc, char *argv[]) {
<< ", temperature: " << data.imu->temperature; << ", temperature: " << data.imu->temperature;
} }
cv::Mat img;
cv::hconcat(left_data.frame, right_data.frame, img);
cv::imshow("frame", img);
char key = static_cast<char>(cv::waitKey(1)); char key = static_cast<char>(cv::waitKey(1));
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
break; break;

View File

@ -1,5 +1,7 @@
#include "api/processor/disparity_normalized_processor.h" #include "api/processor/disparity_normalized_processor.h"
#include <opencv2/imgproc/imgproc.hpp>
#include <glog/logging.h> #include <glog/logging.h>
MYNTEYE_BEGIN_NAMESPACE MYNTEYE_BEGIN_NAMESPACE
@ -17,14 +19,15 @@ std::string DisparityNormalizedProcessor::Name() {
} }
Object *DisparityNormalizedProcessor::OnCreateOutput() { Object *DisparityNormalizedProcessor::OnCreateOutput() {
return nullptr; return new ObjMat();
} }
void DisparityNormalizedProcessor::OnProcess( void DisparityNormalizedProcessor::OnProcess(
Object *const in, Object *const out, Processor *const parent) { Object *const in, Object *const out, Processor *const parent) {
UNUSED(in)
UNUSED(out)
UNUSED(parent) UNUSED(parent)
const ObjMat *input = Object::Cast<ObjMat>(in);
ObjMat *output = Object::Cast<ObjMat>(out);
cv::normalize(input->value, output->value, 0, 255, cv::NORM_MINMAX, CV_8UC1);
} }
MYNTEYE_END_NAMESPACE MYNTEYE_END_NAMESPACE

View File

@ -1,11 +1,45 @@
#include "api/processor/disparity_processor.h" #include "api/processor/disparity_processor.h"
#include <opencv2/calib3d/calib3d.hpp>
#include <glog/logging.h> #include <glog/logging.h>
MYNTEYE_BEGIN_NAMESPACE MYNTEYE_BEGIN_NAMESPACE
DisparityProcessor::DisparityProcessor() : Processor() { DisparityProcessor::DisparityProcessor() : Processor() {
VLOG(2) << __func__; VLOG(2) << __func__;
int sgbmWinSize = 3;
int numberOfDisparities = 64;
#ifdef USE_OPENCV2
// StereoSGBM
// http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?#stereosgbm
sgbm_ = cv::Ptr<cv::StereoSGBM>(
new cv::StereoSGBM(
0, // minDisparity
numberOfDisparities, // numDisparities
sgbmWinSize, // SADWindowSize
8 * sgbmWinSize * sgbmWinSize, // P1
32 * sgbmWinSize * sgbmWinSize, // P2
1, // disp12MaxDiff
63, // preFilterCap
10, // uniquenessRatio
100, // speckleWindowSize
32, // speckleRange
false)); // fullDP
#else
sgbm_ = cv::StereoSGBM::create(0, 16, 3);
sgbm_->setPreFilterCap(63);
sgbm_->setBlockSize(sgbmWinSize);
sgbm_->setP1(8 * sgbmWinSize * sgbmWinSize);
sgbm_->setP2(32 * sgbmWinSize * sgbmWinSize);
sgbm_->setMinDisparity(0);
sgbm_->setNumDisparities(numberOfDisparities);
sgbm_->setUniquenessRatio(10);
sgbm_->setSpeckleWindowSize(100);
sgbm_->setSpeckleRange(32);
sgbm_->setDisp12MaxDiff(1);
#endif
} }
DisparityProcessor::~DisparityProcessor() { DisparityProcessor::~DisparityProcessor() {
@ -17,14 +51,36 @@ std::string DisparityProcessor::Name() {
} }
Object *DisparityProcessor::OnCreateOutput() { Object *DisparityProcessor::OnCreateOutput() {
return nullptr; return new ObjMat();
} }
void DisparityProcessor::OnProcess( void DisparityProcessor::OnProcess(
Object *const in, Object *const out, Processor *const parent) { Object *const in, Object *const out, Processor *const parent) {
UNUSED(in)
UNUSED(out)
UNUSED(parent) UNUSED(parent)
const ObjMat2 *input = Object::Cast<ObjMat2>(in);
ObjMat *output = Object::Cast<ObjMat>(out);
cv::Mat disparity;
#ifdef USE_OPENCV2
// StereoSGBM::operator()
// http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereosgbm-operator
// Output disparity map. It is a 16-bit signed single-channel image of the
// same size as the input image.
// It contains disparity values scaled by 16. So, to get the floating-point
// disparity map,
// you need to divide each disp element by 16.
(*sgbm_)(input->first, input->second, disparity);
#else
// compute()
// http://docs.opencv.org/master/d2/d6e/classcv_1_1StereoMatcher.html
// Output disparity map. It has the same size as the input images.
// Some algorithms, like StereoBM or StereoSGBM compute 16-bit fixed-point
// disparity map
// (where each disparity value has 4 fractional bits),
// whereas other algorithms output 32-bit floating-point disparity map.
sgbm_->compute(input->first, input->second, disparity);
#endif
output->value = disparity / 16 + 1;
} }
MYNTEYE_END_NAMESPACE MYNTEYE_END_NAMESPACE

View File

@ -6,6 +6,12 @@
#include "api/processor/processor.h" #include "api/processor/processor.h"
namespace cv {
class StereoSGBM;
} // namespace cv
MYNTEYE_BEGIN_NAMESPACE MYNTEYE_BEGIN_NAMESPACE
class DisparityProcessor : public Processor { class DisparityProcessor : public Processor {
@ -21,6 +27,9 @@ class DisparityProcessor : public Processor {
Object *OnCreateOutput() override; Object *OnCreateOutput() override;
void OnProcess( void OnProcess(
Object *const in, Object *const out, Processor *const parent) override; Object *const in, Object *const out, Processor *const parent) override;
private:
cv::Ptr<cv::StereoSGBM> sgbm_;
}; };
MYNTEYE_END_NAMESPACE MYNTEYE_END_NAMESPACE