aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYinhang Liu <yinhangx.liu@intel.com>2017-12-05 18:10:58 +0800
committerwindyuan <feng.yuan@intel.com>2017-12-11 19:19:44 +0800
commit2a54829b2e0851133645ae499470e8eb8baab9f3 (patch)
treee24519eee898bc1db2a3dcae06ecd860146a7618
parent87008d9b47e08936ce6ee1e396ea7a218d451f00 (diff)
downloadlibxcam-2a54829b2e0851133645ae499470e8eb8baab9f3.tar.gz
stitcher: optimize the image quality
-rw-r--r--modules/ocl/cl_image_360_stitch.cpp17
-rw-r--r--modules/ocl/cv_feature_match.cpp10
-rw-r--r--modules/soft/cv_capi_feature_match.cpp13
-rw-r--r--modules/soft/soft_stitcher.cpp17
-rw-r--r--xcore/interface/feature_match.cpp6
-rw-r--r--xcore/interface/feature_match.h8
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)
{}
};