diff options
author | Yinhang Liu <yinhangx.liu@intel.com> | 2017-12-05 18:10:58 +0800 |
---|---|---|
committer | windyuan <feng.yuan@intel.com> | 2017-12-11 19:19:44 +0800 |
commit | 2a54829b2e0851133645ae499470e8eb8baab9f3 (patch) | |
tree | e24519eee898bc1db2a3dcae06ecd860146a7618 | |
parent | 87008d9b47e08936ce6ee1e396ea7a218d451f00 (diff) | |
download | libxcam-2a54829b2e0851133645ae499470e8eb8baab9f3.tar.gz |
stitcher: optimize the image quality
-rw-r--r-- | modules/ocl/cl_image_360_stitch.cpp | 17 | ||||
-rw-r--r-- | modules/ocl/cv_feature_match.cpp | 10 | ||||
-rw-r--r-- | modules/soft/cv_capi_feature_match.cpp | 13 | ||||
-rw-r--r-- | modules/soft/soft_stitcher.cpp | 17 | ||||
-rw-r--r-- | xcore/interface/feature_match.cpp | 6 | ||||
-rw-r--r-- | xcore/interface/feature_match.h | 8 |
6 files changed, 56 insertions, 15 deletions
diff --git a/modules/ocl/cl_image_360_stitch.cpp b/modules/ocl/cl_image_360_stitch.cpp index bf1d1ec..ae19b27 100644 --- a/modules/ocl/cl_image_360_stitch.cpp +++ b/modules/ocl/cl_image_360_stitch.cpp @@ -120,16 +120,22 @@ get_fm_default_config (StitchResMode res_mode) config.min_corners = 8; config.offset_factor = 0.8f; config.delta_mean_offset = 5.0f; + config.recur_offset_error = 8.0f; config.max_adjusted_offset = 12.0f; + config.max_valid_offset_y = 8.0f; + config.max_track_error = 24.0f; break; } case StitchRes1080P4: { - config.sitch_min_width = 96; - config.min_corners = 8; + config.sitch_min_width = 128; + config.min_corners = 4; config.offset_factor = 0.8f; - config.delta_mean_offset = 5.0f; - config.max_adjusted_offset = 12.0f; + config.delta_mean_offset = 24.0f; + config.recur_offset_error = 12.0f; + config.max_adjusted_offset = 24.0f; + config.max_valid_offset_y = 64.0f; + config.max_track_error = 32.0f; break; } @@ -138,7 +144,10 @@ get_fm_default_config (StitchResMode res_mode) config.min_corners = 8; config.offset_factor = 0.8f; config.delta_mean_offset = 5.0f; + config.recur_offset_error = 8.0f; config.max_adjusted_offset = 12.0f; + config.max_valid_offset_y = 8.0f; + config.max_track_error = 24.0f; break; } diff --git a/modules/ocl/cv_feature_match.cpp b/modules/ocl/cv_feature_match.cpp index 16a6a0f..d670446 100644 --- a/modules/ocl/cv_feature_match.cpp +++ b/modules/ocl/cv_feature_match.cpp @@ -83,14 +83,18 @@ CVFeatureMatch::get_valid_offsets ( count = 0; sum = 0.0f; for (uint32_t i = 0; i < status.size (); ++i) { + if (!status[i]) + continue; + #if XCAM_CV_FM_DEBUG cv::Point start = cv::Point(corner0[i]) * XCAM_CV_OF_DRAW_SCALE; cv::circle (debug_img, start, 4, cv::Scalar(255), XCAM_CV_OF_DRAW_SCALE); #endif - - if (!status[i] || error[i] > 24) + if (error[i] > _config.max_track_error) + continue; + if (fabs(corner0[i].y - corner1[i].y) >= _config.max_valid_offset_y) continue; - if (fabs(corner0[i].y - corner1[i].y) >= 8) + if (corner1[i].x < 0.0f || corner1[i].x > img0_size.width) continue; float offset = corner1[i].x - corner0[i].x; diff --git a/modules/soft/cv_capi_feature_match.cpp b/modules/soft/cv_capi_feature_match.cpp index 7085498..c4a38ac 100644 --- a/modules/soft/cv_capi_feature_match.cpp +++ b/modules/soft/cv_capi_feature_match.cpp @@ -94,8 +94,9 @@ CVCapiFeatureMatch::get_valid_offsets ( { count = 0; sum = 0.0f; + for (uint32_t i = 0; i < status.size (); ++i) { - if (!status[i] || error[i] > 24) + if (!status[i]) continue; #if XCAM_CV_CAPI_FM_DEBUG @@ -103,7 +104,11 @@ CVCapiFeatureMatch::get_valid_offsets ( cv::Point start = cv::Point (corner0[i].x, corner0[i].y); cv::circle (mat, start, 2, cv::Scalar(255), 2); #endif - if (fabs(corner0[i].y - corner1[i].y) >= 8) + if (error[i] > _config.max_track_error) + continue; + if (fabs(corner0[i].y - corner1[i].y) >= _config.max_valid_offset_y) + continue; + if (corner1[i].x < 0.0f || corner1[i].x > img0_size.width) continue; float offset = corner1[i].x - corner0[i].x; @@ -179,7 +184,7 @@ CVCapiFeatureMatch::detect_and_match ( std::vector<char> status; std::vector<CvPoint2D32f> corner_left, corner_right; - CvSize win_size = cvSize (5, 5); + CvSize win_size = cvSize (41, 41); add_detected_data (img_left, corner_left); int count = corner_left.size (); @@ -199,7 +204,7 @@ CVCapiFeatureMatch::detect_and_match ( cvCalcOpticalFlowPyrLK ( img_left, img_right, 0, 0, corner_points1, corner_points2, count, win_size, 3, - optflow_status, optflow_errs, cvTermCriteria(CV_TERMCRIT_ITER, 40, 0.1), 0 ); + optflow_status, optflow_errs, cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 10, 0.01f), 0); #if XCAM_CV_CAPI_FM_DEBUG XCAM_LOG_INFO ("FeatureMatch(idx:%d): matched corners:%d", _fm_idx, count); diff --git a/modules/soft/soft_stitcher.cpp b/modules/soft/soft_stitcher.cpp index cb98293..895597a 100644 --- a/modules/soft/soft_stitcher.cpp +++ b/modules/soft/soft_stitcher.cpp @@ -343,7 +343,17 @@ StitcherImpl::init_config (uint32_t count) #if ENABLE_FEATURE_MATCH _overlaps[i].matcher = new CVCapiFeatureMatch; - //_overlaps[i].matcher->set_config (); + + CVFMConfig config; + config.sitch_min_width = 136; + config.min_corners = 4; + config.offset_factor = 0.8f; + config.delta_mean_offset = 120.0f; + config.recur_offset_error = 8.0f; + config.max_adjusted_offset = 24.0f; + config.max_valid_offset_y = 20.0f; + config.max_track_error = 28.0f; + _overlaps[i].matcher->set_config (config); _overlaps[i].matcher->set_fm_index (i); #endif @@ -489,6 +499,11 @@ StitcherImpl::feature_match ( Rect right_ovlap = overlap_info.right; const VideoBufferInfo left_buf_info = left_buf->get_video_info (); + left_ovlap.pos_y = left_ovlap.height / 5; + left_ovlap.height = left_ovlap.height / 2; + right_ovlap.pos_y = right_ovlap.height / 5; + right_ovlap.height = right_ovlap.height / 2; + _overlaps[idx].matcher->reset_offsets (); _overlaps[idx].matcher->optical_flow_feature_match ( left_buf, right_buf, left_ovlap, right_ovlap, left_buf_info.width); diff --git a/xcore/interface/feature_match.cpp b/xcore/interface/feature_match.cpp index 82a0118..4a6a428 100644 --- a/xcore/interface/feature_match.cpp +++ b/xcore/interface/feature_match.cpp @@ -81,7 +81,7 @@ FeatureMatch::get_mean_offset (std::vector<float> &offsets, float sum, int &coun sum = 0.0f; for (size_t i = 0; i < offsets.size (); ++i) { - if (fabs (offsets[i] - mean_offset) >= 8.0f) + if (fabs (offsets[i] - mean_offset) >= _config.recur_offset_error) continue; sum += offsets[i]; ++recur_count; @@ -123,11 +123,13 @@ FeatureMatch::adjust_stitch_area (int dst_width, float &x_offset, Rect &stitch0, int last_overlap_width = stitch1.pos_x + stitch1.width + (dst_width - (stitch0.pos_x + stitch0.width)); // int final_overlap_width = stitch1.pos_x + stitch1.width + (dst_width - (stitch0.pos_x - x_offset + stitch0.width)); + if ((stitch0.pos_x - x_offset + stitch0.width) > dst_width) + x_offset = dst_width - (stitch0.pos_x + stitch0.width); int final_overlap_width = last_overlap_width + x_offset; final_overlap_width = XCAM_ALIGN_AROUND (final_overlap_width, 8); XCAM_ASSERT (final_overlap_width >= _config.sitch_min_width); int center = final_overlap_width / 2; - XCAM_ASSERT (center > _config.sitch_min_width / 2); + XCAM_ASSERT (center >= _config.sitch_min_width / 2); stitch1.pos_x = XCAM_ALIGN_AROUND (center - _config.sitch_min_width / 2, 8); stitch1.width = _config.sitch_min_width; diff --git a/xcore/interface/feature_match.h b/xcore/interface/feature_match.h index c73cbb4..06c0b7b 100644 --- a/xcore/interface/feature_match.h +++ b/xcore/interface/feature_match.h @@ -33,14 +33,20 @@ struct CVFMConfig { int min_corners; // number of minimum efficient corners float offset_factor; // last_offset * offset_factor + cur_offset * (1.0f - offset_factor) float delta_mean_offset; // cur_mean_offset - last_mean_offset - float max_adjusted_offset; // max offset of each adjustment + float recur_offset_error; // cur_offset - mean_offset + float max_adjusted_offset; // maximum offset of each adjustment + float max_valid_offset_y; // valid maximum offset in vertical direction + float max_track_error; // maximum track error CVFMConfig () : sitch_min_width (56) , min_corners (8) , offset_factor (0.8f) , delta_mean_offset (5.0f) + , recur_offset_error (8.0f) , max_adjusted_offset (12.0f) + , max_valid_offset_y (8.0f) + , max_track_error (24.0f) {} }; |