日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV Stitching_detailed 详解

發布時間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV Stitching_detailed 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法流程函數:

1.?(*finder)(img,?features[i])

Mathematical?explanation:

Refer?to?BRIEF:?Binary?Robust?Independent?Elementary?Features?and?ORB:?An?efficient?alternative?to?SIFT?or?SURF

...\sources\modules\stitching\src\matchers.cpp

?

void?OrbFeaturesFinder::find(InputArray?image,?ImageFeatures?&features)

{

//When?UMat?should?be?created?when?opencl?is?on?so?that?cl?buffer?be?allocated?for?this?UMat,?when?the?UMat?is?used?as?a?parameter?of?cl?kernel,?opencl?path?(instead?of?cpu?path)?will?work,?CPU?and?opencl?are?two?modes?

????UMat?gray_image;

?

????CV_Assert((image.type()?==?CV_8UC3)?||?(image.type()?==?CV_8UC4)?||?(image.type()?==?CV_8UC1));

?

????if?(image.type()?==?CV_8UC3)?{

????????cvtColor(image,?gray_image,?COLOR_BGR2GRAY);

????}?else?if?(image.type()?==?CV_8UC4)?{

????????cvtColor(image,?gray_image,?COLOR_BGRA2GRAY);

????}?else?if?(image.type()?==?CV_8UC1)?{

????????gray_image?=?image.getUMat();

????}?else?{

????????CV_Error(Error::StsUnsupportedFormat,?"");

????}

?

if?(grid_size.area()?==?1)

//detect?and?compute?descriptors?based?on?orb?algorithm.

????????orb->detectAndCompute(gray_image,?Mat(),?features.keypoints,?features.descriptors);

????else

????{

????????features.keypoints.clear();

????????features.descriptors.release();

?

????????std::vector<KeyPoint>?points;

????????Mat?_descriptors;

????????UMat?descriptors;

?

????????for?(int?r?=?0;?r?<?grid_size.height;?++r)

????????????for?(int?c?=?0;?c?<?grid_size.width;?++c)

????????????{

????????????????int?xl?=?c?*?gray_image.cols?/?grid_size.width;

????????????????int?yl?=?r?*?gray_image.rows?/?grid_size.height;

????????????????int?xr?=?(c+1)?*?gray_image.cols?/?grid_size.width;

????????????????int?yr?=?(r+1)?*?gray_image.rows?/?grid_size.height;

?

????????????????//?LOGLN("OrbFeaturesFinder::find:?gray_image.empty="?<<?(gray_image.empty()?"true":"false")?<<?",?"

????????????????//?????<<?"?gray_image.size()=("?<<?gray_image.size().width?<<?"x"?<<?gray_image.size().height?<<?"),?"

????????????????//?????<<?"?yl="?<<?yl?<<?",?yr="?<<?yr?<<?",?"

????????????????//?????<<?"?xl="?<<?xl?<<?",?xr="?<<?xr?<<?",?gray_image.data="?<<?((size_t)gray_image.data)?<<?",?"

????????????????//?????<<?"gray_image.dims="?<<?gray_image.dims?<<?"\n");

?

????????????????UMat?gray_image_part=gray_image(Range(yl,?yr),?Range(xl,?xr));

????????????????//?LOGLN("OrbFeaturesFinder::find:?gray_image_part.empty="?<<?(gray_image_part.empty()?"true":"false")?<<?",?"

????????????????//?????<<?"?gray_image_part.size()=("?<<?gray_image_part.size().width?<<?"x"?<<?gray_image_part.size().height?<<?"),?"

????????????????//?????<<?"?gray_image_part.dims="?<<?gray_image_part.dims?<<?",?"

????????????????//?????<<?"?gray_image_part.data="?<<?((size_t)gray_image_part.data)?<<?"\n");

?

//Functions?in?this?level?should?be?directly?used?from?opencv_features2d300d.lib?instead?of?using?

...\sources\modules\features2d\src\orb.cpp?sentence?by?sentence??

????????????????orb->detectAndCompute(gray_image_part,?UMat(),?points,?descriptors);

?

????????????????features.keypoints.reserve(features.keypoints.size()?+?points.size());

????????????????for?(std::vector<KeyPoint>::iterator?kp?=?points.begin();?kp?!=?points.end();?++kp)

????????????????{

????????????????????kp->pt.x?+=?xl;

????????????????????kp->pt.y?+=?yl;

????????????????????features.keypoints.push_back(*kp);

????????????????}

????????????????_descriptors.push_back(descriptors.getMat(ACCESS_READ));

????????????}

?

????????//?TODO?optimize?copyTo()

????????//features.descriptors?=?_descriptors.getUMat(ACCESS_READ);

????????_descriptors.copyTo(features.descriptors);

????}

}

1.?matcher(features,?pairwise_matches);

Call?without?using?ocl?

...\sources\modules\stitching\src\matchers.cpp

?

void?operator?()(const?Range?&r)?const

{

????????const?int?num_images?=?static_cast<int>(features.size());

????????for?(int?i?=?r.start;?i?<?r.end;?++i)

????????{

????????????int?from?=?near_pairs[i].first;

????????????int?to?=?near_pairs[i].second;

????????????int?pair_idx?=?from*num_images?+?to;

?

????????????matcher(features[from],?features[to],?pairwise_matches[pair_idx]);

?

????????????pairwise_matches[pair_idx].src_img_idx?=?from;

????????????pairwise_matches[pair_idx].dst_img_idx?=?to;

?

????????????size_t?dual_pair_idx?=?to*num_images?+?from;

?

????????????pairwise_matches[dual_pair_idx]?=?pairwise_matches[pair_idx];

????????????pairwise_matches[dual_pair_idx].src_img_idx?=?to;

????????????pairwise_matches[dual_pair_idx].dst_img_idx?=?from;

?

????????????if?(!pairwise_matches[pair_idx].H.empty())

????????????????pairwise_matches[dual_pair_idx].H?=?pairwise_matches[pair_idx].H.inv();

?

????????????for?(size_t?j?=?0;?j?<?pairwise_matches[dual_pair_idx].matches.size();?++j)

????????????????std::swap(pairwise_matches[dual_pair_idx].matches[j].queryIdx,

??????????????????????????pairwise_matches[dual_pair_idx].matches[j].trainIdx);

????????????LOG(".");

????????}

}

The?red?sentence?calls

void?BestOf2NearestMatcher::match(const?ImageFeatures?&features1,?const?ImageFeatures?&features2,

??????????????????????????????????MatchesInfo?&matches_info)

{

????(*impl_)(features1,?features2,?matches_info);

?

????//?Check?if?it?makes?sense?to?find?homography

//?We?need?at?least?6?points?to?calculate?the?Homography?matrix??

????if?(matches_info.matches.size()?<?static_cast<size_t>(num_matches_thresh1_))

????????return;

?

????//?Construct?point-point?correspondences?for?homography?estimation

????Mat?src_points(1,?static_cast<int>(matches_info.matches.size()),?CV_32FC2);

????Mat?dst_points(1,?static_cast<int>(matches_info.matches.size()),?CV_32FC2);

//Change?the?origin?of?the?coordinate?system?to?be?the?center?of?the?image?

????for?(size_t?i?=?0;?i?<?matches_info.matches.size();?++i)

????{

????????const?DMatch&?m?=?matches_info.matches[i];

?

????????Point2f?p?=?features1.keypoints[m.queryIdx].pt;

????????p.x?-=?features1.img_size.width?*?0.5f;

????????p.y?-=?features1.img_size.height?*?0.5f;

????????src_points.at<Point2f>(0,?static_cast<int>(i))?=?p;

?

????????p?=?features2.keypoints[m.trainIdx].pt;

????????p.x?-=?features2.img_size.width?*?0.5f;

????????p.y?-=?features2.img_size.height?*?0.5f;

????????dst_points.at<Point2f>(0,?static_cast<int>(i))?=?p;

????}

?

????//?Find?pair-wise?motion

????matches_info.H?=?findHomography(src_points,?dst_points,?matches_info.inliers_mask,?RANSAC);

????if?(matches_info.H.empty()?||?std::abs(determinant(matches_info.H))?<?std::numeric_limits<double>::epsilon())

????????return;

?

????//?Find?number?of?inliers

????matches_info.num_inliers?=?0;

????for?(size_t?i?=?0;?i?<?matches_info.inliers_mask.size();?++i)

????????if?(matches_info.inliers_mask[i])

????????????matches_info.num_inliers++;

?

????//?These?coeffs?are?from?paper?M.?Brown?and?D.?Lowe.?"Automatic?Panoramic?Image?Stitching

????//?using?Invariant?Features"

//?Mathematical?explanation:?Refer?to?Section?3.2?in?the?paper,?(7)?to?(9)?represents?the?probability?of?a?proportion?of?matching?pairs?to?be?inliers?given?a?correct?image?match(two?images),?

//?the?posterior?probability?that?an?image?match?is?correct?is?in?(11),?so?if?we?want?the?image?match?to?be?correct,?the?number?of?inliers?should?satisfy?(13),?i.e.?matches_info.num_inliers?>?(8?+?0.3?*?matches_info.matches.size())

????matches_info.confidence?=?matches_info.num_inliers?/?(8?+?0.3?*?matches_info.matches.size());

?

????//?Set?zero?confidence?to?remove?matches?between?too?close?images,?as?they?don't?provide

????//?additional?information?anyway.?The?threshold?was?set?experimentally.

????matches_info.confidence?=?matches_info.confidence?>?3.???0.?:?matches_info.confidence;

?

????//?Check?if?we?should?try?to?refine?motion

//?num_inliers?should?also?be?larger?than?6?

????if?(matches_info.num_inliers?<?num_matches_thresh2_)

????????return;

?

????//?Construct?point-point?correspondences?for?inliers?only

????src_points.create(1,?matches_info.num_inliers,?CV_32FC2);

????dst_points.create(1,?matches_info.num_inliers,?CV_32FC2);

????int?inlier_idx?=?0;

????for?(size_t?i?=?0;?i?<?matches_info.matches.size();?++i)

????{

????????if?(!matches_info.inliers_mask[i])

????????????continue;

?

????????const?DMatch&?m?=?matches_info.matches[i];

?

????????Point2f?p?=?features1.keypoints[m.queryIdx].pt;

????????p.x?-=?features1.img_size.width?*?0.5f;

????????p.y?-=?features1.img_size.height?*?0.5f;

????????src_points.at<Point2f>(0,?inlier_idx)?=?p;

?

????????p?=?features2.keypoints[m.trainIdx].pt;

????????p.x?-=?features2.img_size.width?*?0.5f;

????????p.y?-=?features2.img_size.height?*?0.5f;

????????dst_points.at<Point2f>(0,?inlier_idx)?=?p;

?

????????inlier_idx++;

????}

?

????//?Rerun?motion?estimation?on?inliers?only

????matches_info.H?=?findHomography(src_points,?dst_points,?RANSAC);

}

The?red?sentence?calls

void?CpuMatcher::match(const?ImageFeatures?&features1,?const?ImageFeatures?&features2,?MatchesInfo&?matches_info)

{

????CV_Assert(features1.descriptors.type()?==?features2.descriptors.type());

????CV_Assert(features2.descriptors.depth()?==?CV_8U?||?features2.descriptors.depth()?==?CV_32F);

?

#ifdef?HAVE_TEGRA_OPTIMIZATION

????if?(tegra::useTegra()?&&?tegra::match2nearest(features1,?features2,?matches_info,?match_conf_))

????????return;

#endif

?

????matches_info.matches.clear();

?

????Ptr<cv::DescriptorMatcher>?matcher;

#if?0?//?TODO?check?this

????if?(ocl::useOpenCL())

????{

????????matcher?=?makePtr<BFMatcher>((int)NORM_L2);

????}

????else

#endif

????{

//Index?method.?The?corresponing?index?structure?is?composed?of?a?group?of?randomized?kd-trees,?it?can?search?in?parallel.

????????Ptr<flann::IndexParams>?indexParams?=?makePtr<flann::KDTreeIndexParams>();

????????//Searching?method.?

Ptr<flann::SearchParams>?searchParams?=?makePtr<flann::SearchParams>();

?

????????if?(features2.descriptors.depth()?==?CV_8U)

????????{

//FLANN_INDEX_LSH?means?Hamming?distance.?

//LSH?index?system?comes?from?paper?"Multi-probe?LSH:?Efficient?indexing?for?High-Dimensional?Similarity?Search"?by?Qin?Lv

????????????indexParams->setAlgorithm(cvflann::FLANN_INDEX_LSH);

????????????searchParams->setAlgorithm(cvflann::FLANN_INDEX_LSH);

????????}

//Brute?Force?Matcher?and?FLANN?Matcher?are?two?common?matching?methods?in?OpenCV,?matcher?=?makePtr<BFMatcher>((int)NORM_L2);

//and?matcher?=?makePtr<FlannBasedMatcher>(indexParams,?searchParams);

//BFMatcher::BFMatcher(int?normType=NORM_L2,?bool?crossCheck=false?)

//Parameters:?

//normType?–?One?of?NORM_L1,?NORM_L2,?NORM_HAMMING,?NORM_HAMMING2.L1?and?L2?norms?are?preferable?choices?for?SIFT?and?SURF?

//descriptors,?NORM_HAMMING?should?be?used?with?ORB,?BRISK?and?BRIEF,?NORM_HAMMING2?should?be?used?with?ORB?when?WTA_K?==?3?

//or?4?(see?ORB::ORB?constructor?description).

//crossCheck?–?If?it?is?false,?this?is?will?be?default?BFMatcher?behaviour?when?it?finds?the?k?nearest?neighbors?for?each?

//query?descriptor.If?crossCheck?==?true,?then?the?knnMatch()?method?with?k?=?1?will?only?return?pairs(i,?j)?such?that?for?

//i?-?th?query?descriptor?the?j?-?th?descriptor?in?the?matcher’s?collection?is?the?nearest?and?vice?versa,?i.e.the?BFMatcher?

//will?only?return?consistent?pairs.Such?technique?usually?produces?best?results?with?minimal?number?of?outliers?when?there?

//are?enough?matches.This?is?alternative?to?the?ratio?test,?used?by?D.Lowe?in?SIFT?paper.

//class?FlannBasedMatcher?:?public?DescriptorMatcher

//The?difference?of?Bruteforce?and?FLANN?lies?in?that?BFMatcher?always?tries?all?possible?matches?so?that?it?can?find?the?best

//one,?but?FlannBasedMatcher?means?"Fast?Library?forApproximate?Nearest?Neighbors",?faster?but?probably?not?the?best?one.?We?can

//adjust?the?parameters?in?FlannBasedMatcher?to?adjust?accuracy?or?speed.

????????matcher?=?makePtr<FlannBasedMatcher>(indexParams,?searchParams);

????}

????std::vector<?std::vector<DMatch>?>?pair_matches;

????MatchesSet?matches;

?

????//?Find?1->2?matches

//?Find?the?2?features?in?the?second?image?that?can?match?the?features?in?the?first?image?best?

//?The?method?is?by?computing?distance

//?This?function?is?called?by?using?..\..\lib\Debug\opencv_features2d300d.lib,?which?is?precompiled?first,?the?precompiled?files?include?matchers.cpp?in?..\opencv30\sources\modules\features2d\src

????//?The?descriptor?of?FlannBasedMatcher?might?be?of?type?float?or?CV_8U?

matcher->knnMatch(features1.descriptors,?features2.descriptors,?pair_matches,?2);

????for?(size_t?i?=?0;?i?<?pair_matches.size();?++i)

????{

????????if?(pair_matches[i].size()?<?2)//If?the?qualified?matches?are?less?than?2.

????????????continue;

????????const?DMatch&?m0?=?pair_matches[i][0];//The?best?match?

????????const?DMatch&?m1?=?pair_matches[i][1];//Second?best?match?

????????if?(m0.distance?<?(1.f?-?match_conf_)?*?m1.distance)

????????{

????????????matches_info.matches.push_back(m0);//queryIdx,?trainIdx,?imageIdx,?distance?

????????????matches.insert(std::make_pair(m0.queryIdx,?m0.trainIdx));

????????}

????}

????LOG("\n1->2?matches:?"?<<?matches_info.matches.size()?<<?endl);

?

????//?Find?2->1?matches

//?Find?the?2?features?in?the?first?image?that?can?match?the?features?in?the?second?image?best?

????pair_matches.clear();

????matcher->knnMatch(features2.descriptors,?features1.descriptors,?pair_matches,?2);

????for?(size_t?i?=?0;?i?<?pair_matches.size();?++i)

????{

????????if?(pair_matches[i].size()?<?2)

????????????continue;

????????const?DMatch&?m0?=?pair_matches[i][0];

????????const?DMatch&?m1?=?pair_matches[i][1];

????????if?(m0.distance?<?(1.f?-?match_conf_)?*?m1.distance)

//If?for?a?particular?feature?point?in?image?1,?we?cannot?find?2?qualified?matches?or?cannot?find?the?2?matches?that?can?satisfy?the?confidence,?

//and?if?for?another?feature?point?in?image?2,?we?can?find?the?match?connecting?it?to?the?above?feature?point?in?image?1,?then?we?add?this?matching?

//pair?to?matches_info.matches

????????????if?(matches.find(std::make_pair(m0.trainIdx,?m0.queryIdx))?==?matches.end())

????????????????matches_info.matches.push_back(DMatch(m0.trainIdx,?m0.queryIdx,?m0.distance));

????}

????LOG("1->2?&?2->1?matches:?"?<<?matches_info.matches.size()?<<?endl);

}

?

2.?vector<int>?indices?=?leaveBiggestComponent(features,?pairwise_matches,?conf_thresh);

Mathematical?explanation:

Refer?to?Section?3.2?in?paper?“Automatic?Panoramic?Image?Stitching?using?Invariant?Features”

?

Same?with?3,?call?

...\sources\modules\stitching\src\motion_estimators.cpp

//In?image?stitching,?each?pairwise?match?has?a?parameter:?confidence.?For?image?pairs,?if?the?number?of?inliers?is?greater?than?a?function?of?the?number?of?features,?then?this?pair?of?images?can?be?regarded?as?coming?from?the?same?panorama.?

std::vector<int>?leaveBiggestComponent(std::vector<ImageFeatures>?&features,??std::vector<MatchesInfo>?&pairwise_matches,?float?conf_threshold)

{

????const?int?num_images?=?static_cast<int>(features.size());

?

????DisjointSets?comps(num_images);

//comps?represents?sets

????for?(int?i?=?0;?i?<?num_images;?++i)

????{

????????for?(int?j?=?0;?j?<?num_images;?++j)

????????{

????????????if?(pairwise_matches[i*num_images?+?j].confidence?<?conf_threshold)

????????????????continue;

????????????int?comp1?=?comps.findSetByElem(i);

????????????int?comp2?=?comps.findSetByElem(j);

????????????if?(comp1?!=?comp2)

????????????????comps.mergeSets(comp1,?comp2);

????????}

????}

//max_comp?represents?the?set?containing?the?most?matching?images.?

????int?max_comp?=?static_cast<int>(std::max_element(comps.size.begin(),?comps.size.end())?-?comps.size.begin());

?

????std::vector<int>?indices;

????std::vector<int>?indices_removed;

????for?(int?i?=?0;?i?<?num_images;?++i)

//If?the?image?comes?from?the?biggest?set,?we?push?its?index?into?the?indices?set?

????????if?(comps.findSetByElem(i)?==?max_comp)

????????????indices.push_back(i);

????????else

????????????indices_removed.push_back(i);

?

????std::vector<ImageFeatures>?features_subset;

????std::vector<MatchesInfo>?pairwise_matches_subset;

????for?(size_t?i?=?0;?i?<?indices.size();?++i)

????{

//We?also?use?features_subset?to?store?matching?pairs?

????????features_subset.push_back(features[indices[i]]);

????????for?(size_t?j?=?0;?j?<?indices.size();?++j)

????????{

????????????pairwise_matches_subset.push_back(pairwise_matches[indices[i]*num_images?+?indices[j]]);

????????????pairwise_matches_subset.back().src_img_idx?=?static_cast<int>(i);

????????????pairwise_matches_subset.back().dst_img_idx?=?static_cast<int>(j);

????????}

????}

?

????if?(static_cast<int>(features_subset.size())?==?num_images)

????????return?indices;

?

????LOG("Removed?some?images,?because?can't?match?them?or?there?are?too?similar?images:?(");

????LOG(indices_removed[0]?+?1);

????for?(size_t?i?=?1;?i?<?indices_removed.size();?++i)

????????LOG(",?"?<<?indices_removed[i]+1);

????LOGLN(").");

????LOGLN("Try?to?decrease?the?match?confidence?threshold?and/or?check?if?you're?stitching?duplicates.");

?

????features?=?features_subset;

????pairwise_matches?=?pairwise_matches_subset;

?

????return?indices;

}

?

3.?estimator(features,?pairwise_matches,?cameras)

Mathematical?explanation:?Estimate?the?focals?and?rotation?matrices?of?cameras?based?on?pairwise?matches.

//Below?statement?influences?the?methods?used?in?calcJacobian?and?calcError.?

if?(ba_cost_func?==?"reproj")?adjuster?=?makePtr<detail::BundleAdjusterReproj>();//the?cost?function?of?beam?average?method.?(focal?average?method)

else?if?(ba_cost_func?==?"ray")?adjuster?=?makePtr<detail::BundleAdjusterRay>();

?

bool?HomographyBasedEstimator::estimate(

????????const?std::vector<ImageFeatures>?&features,

????????const?std::vector<MatchesInfo>?&pairwise_matches,

????????std::vector<CameraParams>?&cameras)

{

????LOGLN("Estimating?rotations...");

#if?ENABLE_LOG

????int64?t?=?getTickCount();

#endif

?

????const?int?num_images?=?static_cast<int>(features.size());

?

#if?0

????//?Robustly?estimate?focal?length?from?rotating?cameras

????std::vector<Mat>?Hs;

????for?(int?iter?=?0;?iter?<?100;?++iter)

????{

????????int?len?=?2?+?rand()%(pairwise_matches.size()?-?1);

????????std::vector<int>?subset;

????????selectRandomSubset(len,?pairwise_matches.size(),?subset);

????????Hs.clear();

????????for?(size_t?i?=?0;?i?<?subset.size();?++i)

????????????if?(!pairwise_matches[subset[i]].H.empty())

????????????????Hs.push_back(pairwise_matches[subset[i]].H);

????????Mat_<double>?K;

????????if?(Hs.size()?>=?2)

????????{

????????????if?(calibrateRotatingCamera(Hs,?K))

????????????????cin.get();

????????}

????}

#endif

?

????if?(!is_focals_estimated_)

????{

????????//?Estimate?focal?length?and?set?it?for?all?cameras

????????std::vector<double>?focals;

????????estimateFocal(features,?pairwise_matches,?focals);

????????cameras.assign(num_images,?CameraParams());

????????for?(int?i?=?0;?i?<?num_images;?++i)

????????????cameras[i].focal?=?focals[i];

????}

????else

????{

????????for?(int?i?=?0;?i?<?num_images;?++i)

????????{

????????????cameras[i].ppx?-=?0.5?*?features[i].img_size.width;

????????????cameras[i].ppy?-=?0.5?*?features[i].img_size.height;

????????}

????}

?

????//?Restore?global?motion

????Graph?span_tree;

????std::vector<int>?span_tree_centers;

????findMaxSpanningTree(num_images,?pairwise_matches,?span_tree,?span_tree_centers);

????span_tree.walkBreadthFirst(span_tree_centers[0],?CalcRotation(num_images,?pairwise_matches,?cameras));

?

????//?As?calculations?were?performed?under?assumption?that?p.p.?is?in?image?center

????for?(int?i?=?0;?i?<?num_images;?++i)

????{

????????cameras[i].ppx?+=?0.5?*?features[i].img_size.width;

????????cameras[i].ppy?+=?0.5?*?features[i].img_size.height;

????}

?

????LOGLN("Estimating?rotations,?time:?"?<<?((getTickCount()?-?t)?/?getTickFrequency())?<<?"?sec");

????return?true;

}

?

4.?(*adjuster)(features,?pairwise_matches,?cameras)

Bundle?adjustment,?the?aim?is?to?reduce?the?error?in?camera?parameters?estimation,?the?matrix?of?each?camera?should?be?corrected?with?beam?average?algorithm.?The?energy?function?of?beam?average?method?is?decided?by?adjuster?to?be?reproj?or?ray,?it?means?the?error?in?mapping,?each?point?in?a?certain?image?should?be?mapped?to?other?images?to?calculate?mapping?error.?By?simply?integrating?camera?pairs?with?discrete?homography?matrices,?it?is?easy?to?ignore?global?constraints?and?thus?accumulated?error?will?grow.?Also?refer?to?page?338?in?the?Chinese?book.

?

Mathematical?explanation:

First,?it?uses?Levenberg-Marquardt?algorithm?to?get?the?camera?parameters?(number?of?cameras*four?parameters?for?each?camera).?

The?basic?Levenberg-Marquardt?algorithm?is?as?follows:

https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm

Where?we?regard?pairwise_matches?as?the?function?of?parameter?vector?cameras.?We?use?an?object?belonging?to?the?CvLevMarq?class?to?initialize?the?iteration?and?perform?updating?calculation.?Iteration?is?used?to?calculate?the?camera?parameters?based?on?the?mapping?relationship?between?pairwise?matches.?

After?we?get?cam_params_,?we?use?obtainRefinedCameraParams?to?get?focal?length?and?rotation?matrix?of?the?cameras.?

We?use?function?Rodrigues?to?calculate?the?rotation?matrix?of?the?camera?with?rotation?vector,?based?on

We?can?also?refer?to?Section?4?in?“Automatic?Panoramic?Image?Stitching?using?Invariant?Features”

Finally,?construct?max?spanning?tree?using?inliers,?and?find?the?root?node?based?on?search?giving?priority?to?breadth(廣度優先搜索求出根節點),normalize?rotation?matrices.?Find?the?camera?nearest?to?the?center?and?select?its?rotation?matrix?as?the?basis,?then?normalize?the?rotation?matrices?of?other?cameras?by?dividing?them?with?the?basic?rotation?matrix.

?

\\...\sources\modules\stitching\src\motion_estimators.cpp

bool?BundleAdjusterBase::estimate(const?std::vector<ImageFeatures>?&features,//used

??????????????????????????????????const?std::vector<MatchesInfo>?&pairwise_matches,

??????????????????????????????????std::vector<CameraParams>?&cameras)

{

????LOG_CHAT("Bundle?adjustment");

#if?ENABLE_LOG

????int64?t?=?getTickCount();

#endif

?

????num_images_?=?static_cast<int>(features.size());

????features_?=?&features[0];

????pairwise_matches_?=?&pairwise_matches[0];

?

????setUpInitialCameraParams(cameras);

?

????//?Leave?only?consistent?image?pairs

????edges_.clear();

????for?(int?i?=?0;?i?<?num_images_?-?1;?++i)

????{

????????for?(int?j?=?i?+?1;?j?<?num_images_;?++j)

????????{

????????????const?MatchesInfo&?matches_info?=?pairwise_matches_[i?*?num_images_?+?j];

????????????if?(matches_info.confidence?>?conf_thresh_)

????????????????edges_.push_back(std::make_pair(i,?j));

????????}

????}

?

????//?Compute?number?of?correspondences

????total_num_matches_?=?0;

????for?(size_t?i?=?0;?i?<?edges_.size();?++i)

????????total_num_matches_?+=?static_cast<int>(pairwise_matches[edges_[i].first?*?num_images_?+??edges_[i].second].num_inliers);

?

//Levenberg?Marquardt?

//Implementation?of?Levenberg?Marquardt?nonlinear?least?squares?algorithms?used?to?iteratively?finds?a?local?minimum?of?a?function?that?is?expressed?as?the?sum?of?squares?of?non-linear?functions.?

//It?can?be?used?to?non-linearly?estimate?the?essential?matrix.?OpenCV?internally?use?the?algorithm?to?find?the?camera?intrinsic?and?extrinsic?parameters?from?several?views?of?a?calibration?pattern.??

//refine?extrinsic?parameters?using?iterative?algorithms?

//The?first?parameter?is?the?number?of?all?cameras,?each?of?which?has?4?configuration?parameters?

//The?second?parameter?is?the?sum?of?the?measurement?error?of?input?data(all?matches)?

//The?third?parameter?is?the?termination?criterion?

????CvLevMarq?solver(num_images_?*?num_params_per_cam_,

?????????????????????total_num_matches_?*?num_errs_per_measurement_,

?????????????????????term_criteria_);

?

????Mat?err,?jac;

//cam_params_?is?the?camera?parameters?vector?

????CvMat?matParams?=?cam_params_;

????cvCopy(&matParams,?solver.param);

?

????int?iter?=?0;

????for(;;)

????{

????????const?CvMat*?_param?=?0;

????????CvMat*?_jac?=?0;

????????CvMat*?_err?=?0;

//update?camera?parameters?according?to?

//It?uses?SVD,?the?termination?criterion?is?the?maximum?iteration?number?or?if?the?change?in?camera?parameters?between?adjacent?iteration?times?is?small?enough.?The?matrix?J?and?err?are?calculated?by?calcJacobian?and?calcError.?Error?means?how?close?the?parameters?can?satisfy?pairwise_matches.?

????????bool?proceed?=?solver.update(_param,?_jac,?_err);

?

????????cvCopy(_param,?&matParams);

?

????????if?(!proceed?||?!_err)

????????????break;

?

????????if?(_jac)

????????{

????????????calcJacobian(jac);

????????????CvMat?tmp?=?jac;

????????????cvCopy(&tmp,?_jac);

????????}

?

????????if?(_err)

????????{

????????????calcError(err);

????????????LOG_CHAT(".");

????????????iter++;

????????????CvMat?tmp?=?err;

????????????cvCopy(&tmp,?_err);

????????}

????}

?

????LOGLN_CHAT("");

????LOGLN_CHAT("Bundle?adjustment,?final?RMS?error:?"?<<?std::sqrt(err.dot(err)?/?total_num_matches_));

????LOGLN_CHAT("Bundle?adjustment,?iterations?done:?"?<<?iter);

?

????//?Check?if?all?camera?parameters?are?valid

????bool?ok?=?true;

????for?(int?i?=?0;?i?<?cam_params_.rows;?++i)

????{

????????if?(cvIsNaN(cam_params_.at<double>(i,0)))

????????{

????????????ok?=?false;

????????????break;

????????}

????}

????if?(!ok)

????????return?false;

?

????obtainRefinedCameraParams(cameras);

?

????//?Normalize?motion?to?center?image

????Graph?span_tree;

????std::vector<int>?span_tree_centers;

????findMaxSpanningTree(num_images_,?pairwise_matches,?span_tree,?span_tree_centers);

????Mat?R_inv?=?cameras[span_tree_centers[0]].R.inv();

????for?(int?i?=?0;?i?<?num_images_;?++i)

????????cameras[i].R?=?R_inv?*?cameras[i].R;

?

????LOGLN_CHAT("Bundle?adjustment,?time:?"?<<?((getTickCount()?-?t)?/?getTickFrequency())?<<?"?sec");

????return?true;

}

solver.update?calls?

cvcalibration.cpp

bool?CvLevMarq::update(?const?CvMat*&?_param,?CvMat*&?matJ,?CvMat*&?_err?)

{

????double?change;

?

????matJ?=?_err?=?0;

?

????assert(?!err.empty()?);

????if(?state?==?DONE?)

????{

????????_param?=?param;

????????return?false;

????}

?

????if(?state?==?STARTED?)

????{

????????_param?=?param;

????????cvZero(?J?);

????????cvZero(?err?);

????????matJ?=?J;

????????_err?=?err;

????if(?state?==?CALC_J?)

????{

//cvMulTransposed(const?CvArr*?src,?CvArr*?dst,?int?order,?const?CvArr*?delta=NULL)

//src:?input?matrix

//dst:?ourput?matrix?

//If?order?=?0?

//dst=(src-delta)*(src-delta)T

//If?order?=?1?

//dst=(src-delat)T*(src-delta)

????????cvMulTransposed(?J,?JtJ,?1?);

//cvGEMM(const?CvArr*?src1,?const?CvArr*?src2,?double?alpha,?const?CvArr*?src3,?double?beta,?CvArr*dst,?int?tABC=0)

//dst=alpha*src1T*src2+beta*src3T?

//JtErr=JT*err

????????cvGEMM(?J,?err,?1,?0,?0,?JtErr,?CV_GEMM_A_T?);

????????cvCopy(?param,?prevParam?);

????????step();

void?CvLevMarq::step()

{

????const?double?LOG10?=?log(10.);

????double?lambda?=?exp(lambdaLg10*LOG10);

//param?=?cvCreateMat(?nparams,?1,?CV_64F?)

int?i,?j,?nparams?=?param->rows;

?

//Initialize?the?matrix?JtJ?with?size?nparams-by-nparams?to?zero?and?vector?JtErr?with?length?JtErr?to?zero

????for(?i?=?0;?i?<?nparams;?i++?)

????????if(?mask->data.ptr[i]?==?0?)

????????{

//Each?row?is?the?partial?derivative?of?f(xi,beta)?with?respect?to?vector?beta.?Here?i?is?the?iterative?time?

????????????double?*row?=?JtJ->data.db?+?i*nparams,?*col?=?JtJ->data.db?+?i;

????????????for(?j?=?0;?j?<?nparams;?j++?)

????????????????row[j]?=?col[j*nparams]?=?0;

????????????JtErr->data.db[i]?=?0;

????????}

????cv::Mat?cvJtJ(JtJ);

????cv::Mat?cvparam(param);

????if(?!err?)

????????cvCompleteSymm(?JtJ,?completeSymmFlag?);

#if?1

????cvCopy(?JtJ,?JtJN?);

?

????for(?i?=?0;?i?<?nparams;?i++?)

????????JtJN->data.db[(nparams+1)*i]?*=?1.?+?lambda;

#else

????cvSetIdentity(JtJN,?cvRealScalar(lambda));

????cvAdd(?JtJ,?JtJN,?JtJN?);

#endif

????cvSVD(?JtJN,?JtJW,?0,?JtJV,?CV_SVD_MODIFY_A?+?CV_SVD_U_T?+?CV_SVD_V_T?);

//calculate?delta?with?singular?value?decomposition?and?store?delta?in?param?

????cvSVBkSb(?JtJW,?JtJV,?JtJV,?JtErr,?param,?CV_SVD_U_T?+?CV_SVD_V_T?);

????for(?i?=?0;?i?<?nparams;?i++?)?{

????????double?delta?=?(mask->data.ptr[i]???param->data.db[i]?:?0);

????if?(delta?!=?0.0)

????????delta?=?delta?+?0.0;

????????param->data.db[i]?=?prevParam->data.db[i]?-?(mask->data.ptr[i]???param->data.db[i]?:?0);

????}

}

????????if(?iters?==?0?)

????????????prevErrNorm?=?cvNorm(err,?0,?CV_L2);

????????_param?=?param;

????????cvZero(?err?);

????????_err?=?err;

????????state?=?CHECK_ERR;

????????return?true;

????}

?

????assert(?state?==?CHECK_ERR?);

????errNorm?=?cvNorm(?err,?0,?CV_L2?);

????if(?errNorm?>?prevErrNorm?)

????{

????????lambdaLg10++;

????????step();

????????_param?=?param;

????????cvZero(?err?);

????????_err?=?err;

????????state?=?CHECK_ERR;

????????return?true;

????}

?

????lambdaLg10?=?MAX(lambdaLg10-1,?-16);

????if(?++iters?>=?criteria.max_iter?||

????????(((change?=?cvNorm(param,?prevParam,?CV_RELATIVE_L2))?<?criteria.epsilon?)&&(change?!=0))?)

{

????????_param?=?param;

????????state?=?DONE;

????????return?true;

????}

?

????prevErrNorm?=?errNorm;

????_param?=?param;

????cvZero(J);

????matJ?=?J;

????_err?=?err;

????state?=?CALC_J;

????return?true;

}

????????state?=?CALC_J;

????????return?true;

????}

5.?waveCorrect(rmats,?wave_correct);

Deal?with?the?problem?where?neighboring?images?not?in?the?same?horizontal?line.?It?calculates?the?‘up’?vector?of?each?camera?from?the?horizontal?line?and?correct?them.?It?calculates?the?eigenvalues?and?eigenvectors?of?a?symmetric?matrix.?If?it?is?horizontal?correction,?it?will?delete?the?3rd?row?of?feature?vector,?if?it?is?vertical?correction,?it?will?delete?the?1st?row?of?feature?vector.?Finally,?it?corrects?the?matrices?of?all?cameras.?Rmats[i]?is?the?corrected?rotation?matrix?of?the?ith?camera.?

?

Mathematical?explanation:

Input?is?the?rotation?matrices?of?cameras,?they?are?corrected?in?the?function.

Refer?to?Section?5?in?“Automatic?Panoramic?Image?Stitching?using?Invariant?Features”

?

?

主要使用兩個約束條件來計算全局旋轉矩陣:

1.?相機坐標系的X軸與世界坐標系中的Z軸垂直。

2.?相機的旋轉矩陣的Z軸方向的平均值與世界坐標系的Z軸相接近。

Call?

...\sources\modules\stitching\src\?motion_estimators.cpp

a)?void?waveCorrect(std::vector<Mat>?&rmats,?WaveCorrectKind?kind)

?

6.?warper->warp(images[i],?K,?cameras[i].R,?INTER_LINEAR,?BORDER_REFLECT,?images_warped[i]);???OpenCL

The?function?converts?a?pair?of?maps?for?remap?from?one?representation?to?another.?As?is?explained?in?OpenCL?file,?together?with??images_warped[i].convertTo(images_warped_f[i],?CV_32F).

?

7.??compensator->feed(corners,?images_warped,?masks_warped);

Multiple?band?blend,?first?initialize?compensator,?make?sure?of?the?fusion?method?of?compensator,?default?fusion?method?is?multiple?band?blend,?also?we?calculate?the?size?of?panorama?based?on?corners.?

Mathematical?explanation:

?

Quadratic?objective?function.

Refer?to?Section?6?in?“Automatic?Panoramic?Image?Stitching?using?Invariant?Features”?

Gain?is?used?in?compensator->apply(img_idx,?corners[img_idx],?img_warped,?????mask_warped).

?

8.??seam_finder->find(images_warped_f,?corners,?masks_warped);

Mathematical?explanation:

Suppose?the?left?image?is?A,?the?right?image?is?B,?then

?

C?is?the?overlap?area,?to?find?the?seamline,?we?need?an?energy?function:

?

N?is?the?3-by-3?neighborhood?of?points?in?overlap?area.?Suppose?(p,q)?are?two?neighboring?points?in?A,?and?(p’,q’)?are?their?counterparts?in?B,?then

?


The?energy?function?counts?the?difference?of?gradients?in?two?images.?

?

...\sources\modules\stitching\src\seam_finders.cpp

void?GraphCutSeamFinder::Impl::find(const?std::vector<UMat>?&src,?const?std::vector<Point>?&corners,?std::vector<UMat>?&masks)

{

????//?Compute?gradients

????dx_.resize(src.size());

????dy_.resize(src.size());

????Mat?dx,?dy;

????for?(size_t?i?=?0;?i?<?src.size();?++i)

????{

????????CV_Assert(src[i].channels()?==?3);

????????Sobel(src[i],?dx,?CV_32F,?1,?0);

????????Sobel(src[i],?dy,?CV_32F,?0,?1);

????????dx_[i].create(src[i].size(),?CV_32F);

????????dy_[i].create(src[i].size(),?CV_32F);

????????for?(int?y?=?0;?y?<?src[i].rows;?++y)

????????{

????????????const?Point3f*?dx_row?=?dx.ptr<Point3f>(y);

????????????const?Point3f*?dy_row?=?dy.ptr<Point3f>(y);

????????????float*?dx_row_?=?dx_[i].ptr<float>(y);

????????????float*?dy_row_?=?dy_[i].ptr<float>(y);

????????????for?(int?x?=?0;?x?<?src[i].cols;?++x)

????????????{

????????????????dx_row_[x]?=?normL2(dx_row[x]);

????????????????dy_row_[x]?=?normL2(dy_row[x]);

????????????}

????????}

????}

????PairwiseSeamFinder::find(src,?corners,?masks);

}

?

9.??blender->feed(img_warped_s,?mask_warped,?corners[img_idx]);

Mathematical?explanation:

Construct?a?pyramid?for?each?image,?number?of?layers?is?based?on?input?parameters,?default?value?is?5,?first?deal?with?image?width?and?height,?make?sure?it's?integer?multiples?of?2^(num?of?bands)?so?that?we?can?downsample?the?image?for?number?of?bands?times,?we?downsample?the?source?image?iteratively?and?upsample?the?bottom?image?iteratively,?substract?the?corresponding?downsampled?and?upsampled?images?to?get?the?high?frequency?components?of?images,?then?store?these?high?frequency?components?to?each?pyramid.?Finally?we?write?the?pyramid?of?each?image?into?the?final?pyramid.?The?final?panorama?is?got?from?adding?all?pyramid?layers.

?

Refer?to?Section?7?in?“Automatic?Panoramic?Image?Stitching?using?Invariant?Features”

?

References:

[1]?Automaic?Panoramic?Image?Stitching?using?Invariant?Features

[2]?Image?Alignment?and?Stitching

[3]?"GrabCut"?-?Interactive?Foreground?Extraction?using?Iterated?Graph?Cuts

[4]?Image?Stitching?Algorithm?Research?Based?on?OpenCV

[5]?計算機視覺算法與應用中文版

[6]?BRIEF:?Binary?Robust?Independent?Elementary?Features.

[7]?ORB:?An?efficient?alternative?to?SIFT?or?SURF.


總結

以上是生活随笔為你收集整理的OpenCV Stitching_detailed 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产色在线视频 | 亚洲国产日韩精品 | 伊人婷婷在线 | 中文字幕一区二区三区在线观看 | 免费看av在线 | 亚州欧美视频 | 久草精品视频在线播放 | 久久天天操| 美女国产网站 | 国产精品美| 在线免费视频一区 | 免费观看视频黄 | 天天草天天插 | 国产精品18久久久久久首页狼 | 国产成人亚洲在线电影 | 91亚洲国产成人久久精品网站 | 欧美欧美 | 激情久久久久久久久久久久久久久久 | 日韩久久网站 | 91av视频观看 | 色美女在线 | 黄网站免费久久 | 中文字幕在线字幕中文 | 亚洲一级特黄 | 亚洲电影在线看 | 99视频精品视频高清免费 | 精品国产a | 精品久久一二三区 | 亚洲欧美日韩中文在线 | 国产免费久久 | 色视频在线看 | 91亚洲国产成人久久精品网站 | 久久精品电影 | 一级黄色大片 | 在线一级片 | 亚洲精品久久久久999中文字幕 | 国产亚洲欧美日韩高清 | 国产精品一区二区久久精品爱涩 | 91看片在线看片 | 免费色视频 | 国产专区欧美专区 | 波多野结衣在线观看一区二区三区 | 九九电影在线 | 超碰人人91| 精品在线观 | 婷婷综合影院 | 欧美激情视频一区 | 91麻豆看国产在线紧急地址 | 亚洲精品av中文字幕在线在线 | 免费的黄色av | 伊人激情网 | 成人中文字幕在线观看 | 国产精品久久久久影院日本 | 97av在线 | 日日夜操| 日韩欧美91| 色婷婷视频在线 | 91成人免费 | 日韩黄色网络 | 最新色视频 | 91在线91拍拍在线91 | 欧美日韩国产在线一区 | 久久看毛片 | 色激情五月| 色a4yy| 日本在线观看一区二区 | 91插插视频 | 国产小视频在线观看 | 久久综合狠狠综合久久激情 | 国产成人久久精品一区二区三区 | 国产视频日韩视频欧美视频 | 国产精品毛片久久 | 手机看片| 最新99热 | 免费婷婷 | 国产一级免费电影 | www.香蕉视频 | 福利视频精品 | 日日躁夜夜躁xxxxaaaa | 国产午夜精品一区二区三区 | 亚洲91av| 久久久久久久精 | 欧美日韩精品免费观看 | 欧洲av在线 | 精品黄色片 | 国产精品免费在线 | 欧美日韩网站 | 麻豆果冻剧传媒在线播放 | 婷婷爱五月天 | 欧美日韩一区二区在线观看 | 伊人激情网 | 狠狠色伊人亚洲综合网站野外 | 99精品视频免费全部在线 | 成人试看120秒 | 91综合色 | 人人插人人插 | 91片黄在线观 | 国产视频色 | 四虎国产精品免费观看视频优播 | 激情五月五月婷婷 | 天天干天天干天天干天天干天天干天天干 | 天天曰天天 | 亚洲精品一区二区18漫画 | av成人在线网站 | 欧美污网站 | 激情网站五月天 | www.亚洲精品在线 | 一级黄色视屏 | 成人一级电影在线观看 | 日韩欧美视频在线免费观看 | 欧美aa级 | 五月婷婷中文网 | 日韩午夜电影网 | 超级碰99 | 一区二区三区四区在线 | 天天干天天射天天爽 | 久久草视频 | 国产做爰视频 | 久久免费精品 | 国产一区免费在线观看 | 在线观看视频亚洲 | 久久中文网 | 91视频 - 114av | 欧美日韩在线观看一区 | 婷婷伊人综合 | 欧美一级片免费在线观看 | 亚洲视频一区二区三区在线观看 | 日本不卡视频 | 国产精品久久久久久久久久久免费 | 久久国产精品小视频 | 麻豆91在线播放 | 日韩三级视频 | 亚洲成人资源在线 | 久久,天天综合 | 天天狠狠操 | 美女黄频| 丁香一区二区 | 四川妇女搡bbbb搡bbbb搡 | 久久午夜鲁丝片 | 91麻豆精品久久久久久 | 中文字幕av日韩 | 中文字幕在线看视频 | 日韩videos高潮hd | 懂色av一区二区在线播放 | 亚洲九九 | 人人爽夜夜爽 | 国产精品入口麻豆 | 精品久久精品 | 91成人久久 | 91在线你懂的 | 国产字幕av | 综合婷婷丁香 | 日批网站在线观看 | 日日爽天天爽 | 亚洲成人麻豆 | 蜜桃麻豆www久久囤产精品 | 日韩久久精品一区二区三区下载 | 国产精品精品国产色婷婷 | 国产精品久久久久久久久久直播 | 亚洲国产97在线精品一区 | 综合婷婷丁香 | 成人av动漫在线观看 | 天天操天天摸天天干 | 亚洲砖区区免费 | 麻豆国产网站入口 | 最新色站| 日日夜夜天天人人 | 波多野结衣精品 | 日韩免 | 亚洲国产精品女人久久久 | 丁香五香天综合情 | 午夜精品久久久久久久爽 | 51久久成人国产精品麻豆 | 91麻豆看国产在线紧急地址 | 日日草夜夜操 | 香蕉影视在线观看 | 中文字幕在线成人 | 亚洲精选国产 | 成人免费视频视频在线观看 免费 | 十八岁以下禁止观看的1000个网站 | 69av网| 亚洲精品乱码久久久久久按摩 | 久久在视频 | 国产毛片久久 | 亚洲视频资源在线 | 久久影视中文字幕 | 国产99一区 | 国产精品免费在线观看视频 | 国产精品亚洲片在线播放 | 日韩在线视频观看免费 | 97视频在线免费播放 | 亚洲欧美在线观看视频 | 91亚洲精品乱码久久久久久蜜桃 | 中文字幕中文字幕在线中文字幕三区 | 国产精品视频久久久 | 中文字幕网站 | www99久久| 精品国产久 | 天天曰天天爽 | 黄色在线网站噜噜噜 | 久草视频在线播放 | 亚洲色图27p | 亚洲jizzjizz日本少妇 | 91精品国产综合久久婷婷香蕉 | 国产 欧美 日韩 | 黄色日视频 | 国产精品 9999| 欧美亚洲精品在线观看 | 久久成人午夜 | 4p变态网欧美系列 | 午夜精品久久久久久99热明星 | 日韩av一卡二卡三卡 | 欧美网址在线观看 | 欧美精品久 | 久久影院中文字幕 | 亚洲午夜精品久久久 | 激情视频网页 | 国产亚洲小视频 | 91高清不卡 | 日韩视频一区二区三区在线播放免费观看 | 久久精品视频在线观看免费 | 国产精品久久久久久久av大片 | 日韩av成人在线观看 | 国产精品电影一区 | 91丨九色丨国产在线 | 久久综合九色综合欧美就去吻 | 久久亚洲日本 | www最近高清中文国语在线观看 | 在线视频专区 | 国产高清精品在线 | 亚洲黄污| 一本色道久久精品 | 日本性生活一级片 | 国产婷婷一区二区 | 国内精品国产三级国产aⅴ久 | 久久99国产精品二区护士 | 国产精品一级视频 | 91视频在线免费 | 婷婷伊人网 | 91大神一区二区三区 | 视频国产在线 | 成人黄色片在线播放 | 亚洲国产精品久久久久 | 久草视频免费观 | 国产精品久久久777 成人手机在线视频 | 国产中文字幕国产 | 99在线热播精品免费99热 | 日本精品久久久久中文字幕 | 成人cosplay福利网站 | 中文字幕第一页在线视频 | 国产精品视频区 | 999精品网| 91在线精品观看 | 欧美91精品久久久久国产性生爱 | 天天天干 | 波多野结衣在线播放视频 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 国产999精品久久久久久 | 少妇搡bbbb搡bbb搡69 | 免费看国产曰批40分钟 | 国产一级黄色免费看 | 亚洲婷婷在线视频 | 国产精品久久伊人 | 500部大龄熟乱视频 欧美日本三级 | 五月婷在线视频 | 激情久久久久久久久久久久久久久久 | a爱爱视频 | 免费看国产视频 | 久久久在线免费观看 | 成人午夜电影在线观看 | 成人网页在线免费观看 | 久久人人干 | 久久综合九色 | 91在线www | 99精品国产福利在线观看免费 | 国产精品1区2区 | 日韩中文在线观看 | 美女视频黄是免费的 | 91精品国产自产在线观看 | 久草在线国产 | 亚洲最大的av网站 | 日日爱av | 91视频在线自拍 | 又黄又爽的免费高潮视频 | 国产亚洲一区二区三区 | 色婷婷福利 | 精品国产精品久久一区免费式 | 国产黑丝一区二区 | 高清不卡一区二区在线 | 99热超碰 | www.亚洲精品视频 | 欧美激情精品久久久久 | 黄色看片 | 久久精品中文字幕免费mv | 五月天中文字幕mv在线 | 久久免费大片 | 日本爱爱片 | 国产亚洲成av人片在线观看桃 | 综合激情网 | 天天躁日日躁狠狠躁av中文 | 成人精品一区二区三区中文字幕 | 免费看的av片 | 日韩av不卡在线播放 | 久久情网 | 久久精品中文字幕少妇 | 国产黄色精品 | 亚洲国产合集 | 成人永久在线 | 免费看三级黄色片 | 免费福利片2019潦草影视午夜 | 国产 日韩 在线 亚洲 字幕 中文 | 91视频免费看网站 | 福利视频第一页 | 13日本xxxxxⅹxxx20 | 久久99久国产精品黄毛片入口 | 亚洲男男gaygay无套 | 中文字幕日本电影 | 国产第一二区 | 蜜桃久久久 | 欧美日韩一区二区在线观看 | 天天操天天干天天操天天干 | 色噜噜在线观看视频 | 中文字幕在线播放日韩 | 精品国产伦一区二区三区观看体验 | 久久久久久久久久久免费视频 | 韩国av一区| 少妇按摩av| 国内一级片在线观看 | 国产精品久久久久一区二区国产 | 国产精品麻 | 国产精品一区二区吃奶在线观看 | 免费观看xxxx9999片 | 精品在线二区 | 9色在线视频 | 91人人干 | 丁香六月婷婷激情 | 免费看色网站 | 91精品久久久久久综合五月天 | 日韩精品偷拍 | 天天射射天天 | 欧美在线aa | 精品福利视频在线观看 | www.日日日.com | 97超视频| 国产午夜亚洲精品 | 成人在线免费小视频 | 中文字幕有码在线 | 国产在线播放一区二区 | 激情导航| 亚洲综合色站 | 中文字幕亚洲综合久久五月天色无吗'' | 亚洲天堂网在线视频 | 成人午夜免费剧场 | 91综合久久一区二区 | 999在线精品 | 色综合久久综合中文综合网 | 黄色视屏免费在线观看 | 91在线精品秘密一区二区 | 五月天中文在线 | 香蕉视频久久久 | 久久精视频 | 美女视频是黄的免费观看 | 日韩黄色中文字幕 | 免费看片黄色 | 69视频网站 | 视频在线观看亚洲 | 日韩一区二区免费视频 | 精品日本视频 | 人人澡超碰碰97碰碰碰软件 | 色视频网站在线观看一=区 a视频免费在线观看 | 97超碰中文 | 成人毛片在线观看 | 一本色道久久精品 | 国产一级黄 | 免费试看一区 | 亚洲成色777777在线观看影院 | 91亚洲国产成人久久精品网站 | 在线观看va | 亚洲色影爱久久精品 | 91av社区 | 97人人人| 国产区在线视频 | 91免费在线视频 | 九九热有精品 | 中文字幕丝袜制服 | 97国产一区 | 国产黄色av | 天天草夜夜 | 在线观看免费观看在线91 | 成人在线视频一区 | 狠狠色狠狠色综合日日小说 | 亚洲综合射 | 狠狠狠狠狠狠天天爱 | 免费黄色在线网址 | 正在播放亚洲精品 | 7777xxxx| 在线观看视频日韩 | 99re国产 | 99久在线精品99re8热视频 | 91在线影视| 日韩视频免费 | 国产精品欧美久久久久天天影视 | 二区精品视频 | 97韩国电影 | 在线观看激情av | 久久国产网 | 国产高清成人 | 日日夜夜91| 日日操夜夜操狠狠操 | 99中文字幕在线观看 | 丁香高清视频在线看看 | 久久se视频 | 国产精品综合久久久久久 | 亚洲欧美激情插 | 91九色蝌蚪国产 | 黄网站a | 国产精品成人aaaaa网站 | 亚洲三级网| 娇妻呻吟一区二区三区 | 久久久久综合 | 91在线国产观看 | 久久精品这里都是精品 | 日韩精品免费在线观看视频 | 热99在线视频 | 国产日韩欧美在线看 | 91天堂影院 | 国产97色在线 | 少妇精品久久久一区二区免费 | 色网站在线免费 | 国产成人精品一区二 | 亚洲精品高清在线观看 | 色婷婷综合视频在线观看 | 99久久99视频只有精品 | 美女国产免费 | 久久久久女人精品毛片 | 欧美综合在线观看 | 91成人久久 | www.综合网.com | 亚洲国产色一区 | 在线看成人 | 97精品国产97久久久久久免费 | 国产精品一区二区在线 | 激情欧美一区二区三区 | 久久免费看视频 | 久久免费99精品久久久久久 | 色干综合 | 一区二区视频在线看 | 国产99久久久欧美黑人 | 丝袜一区在线 | 日韩 在线观看 | 免费日韩精品 | 国内精品久久久久久久影视简单 | 麻豆一区在线观看 | 爱色av.com | 在线观看免费中文字幕 | 亚洲作爱视频 | av在线影视 | www.国产在线 | 92中文资源在线 | 97碰碰碰 | 久久亚洲福利 | 中文字幕日本在线观看 | 99免费在线视频观看 | 99精品偷拍视频一区二区三区 | 国产精国产精品 | 又黄又爽又刺激 | 成人aaa毛片 | 伊人国产在线播放 | 天天色 天天 | 9幺看片| 亚洲一级电影在线观看 | 超碰人人在线 | 一区二区三区在线免费播放 | 欧美成人xxx | 亚洲精品456在线播放第一页 | 日韩一级片大全 | 亚洲激情 在线 | 欧美成年性 | 欧美日一级片 | 国产v欧美 | 在线观看视频福利 | 永久免费的av电影 | 激情影院在线 | 国产高清视频在线播放一区 | 天天躁天天狠天天透 | 国产伦理精品一区二区 | 公开超碰在线 | 97国产一区二区 | 人人插人人玩 | 久久全国免费视频 | 夜夜操天天干, | 一区二区三区四区五区在线视频 | 国产精品成人av久久 | 国产第页| 天天·日日日干 | 国产视频在线免费观看 | 欧美日韩一区二区在线 | 国产精品网红直播 | 日韩乱色精品一区二区 | 国产一区二区三区免费在线观看 | 亚洲精品久久久蜜臀下载官网 | 久久99国产精品免费网站 | 免费国产一区二区视频 | 天天综合网在线 | 午夜资源站| 亚洲高清在线观看视频 | 久久天天躁夜夜躁狠狠85麻豆 | 狠狠色噜噜狠狠狠狠2021天天 | 欧美99热| 欧美在线观看视频一区二区 | 日韩欧美一区二区三区视频 | 色天天综合久久久久综合片 | 在线观看亚洲国产精品 | 亚洲aaa级| 日韩在线观看中文字幕 | 麻豆高清免费国产一区 | avav99| japanesefreesex中国少妇 | 青青河边草免费视频 | 免费在线成人av电影 | 国产精品mv在线观看 | 亚洲午夜av久久乱码 | 亚洲国产小视频在线观看 | 国产午夜三级一区二区三 | 九色porny真实丨国产18 | 丁香六月在线观看 | 粉嫩av一区二区三区四区在线观看 | 国产一级视频免费看 | 国产精品亚洲片夜色在线 | 天天色草 | 久久免费观看少妇a级毛片 久久久久成人免费 | 亚洲综合色播 | 激情小说 五月 | 国产成人性色生活片 | av短片在线 | 免费网站污 | 久久久午夜精品福利内容 | 免费av网站在线看 | 国产这里只有精品 | 国产高清在线免费观看 | 国产视频美女 | 日韩欧美在线一区二区 | 精品国产一区二区三区免费 | 国产老熟 | 在线观看电影av | 三上悠亚一区二区在线观看 | av蜜桃在线 | 日韩在线观看视频在线 | 97理论电影 | 国产va饥渴难耐女保洁员在线观看 | 人人澡超碰碰 | 男女男视频 | 91亚洲在线观看 | 免费网址你懂的 | 日韩av网页 | 午夜色站 | 亚洲播播| 久久伦理影院 | 三级黄色在线观看 | 日韩精品中文字幕一区二区 | 99精品国产一区二区三区麻豆 | 国产传媒一区在线 | 欧美日韩免费观看一区二区三区 | 91中文字幕一区 | 一级成人在线 | 免费在线观看黄网站 | 99国内精品| 五月天丁香亚洲 | 激情久久综合 | 亚洲天堂精品视频 | 精品国产乱码 | 四虎影视成人永久免费观看亚洲欧美 | 天天综合成人网 | 国产欧美精品一区二区三区 | 亚洲色图美腿丝袜 | 亚欧洲精品视频在线观看 | 久久国产网站 | 国产精品亚州 | 亚洲激情综合 | 97超碰在线久草超碰在线观看 | 免费色视频 | 国产精华国产精品 | 五月激情久久久 | 曰本免费av | 日韩成人中文字幕 | 免费福利视频网站 | 亚洲三级黄色 | 亚州精品国产 | 亚洲专区在线播放 | 国产精品永久免费在线 | 国产破处精品 | 国产精品99视频 | 国产成人精品一区二区三区免费 | 97伊人网| 十八岁以下禁止观看的1000个网站 | 麻豆视频免费入口 | 美女黄频视频大全 | 久草在线最新视频 | 91免费网| 黄色资源在线 | 久久久久夜色 | 久草视频在线观 | 国产黄视频在线观看 | 九色激情网 | 一区二区三区韩国免费中文网站 | 久久涩涩网站 | 日韩精品免费在线观看 | 国产精品丝袜在线 | 成人av免费在线 | 中文一区在线 | 91精品国产99久久久久久久 | 亚洲一区二区三区四区精品 | 夜色成人av| 黄色高清视频在线观看 | 日本在线观看一区 | 狠狠狠狠狠狠狠干 | 三级黄色理论片 | 久久精品5 | 96av在线视频 | 五月导航 | 一区二区中文字幕在线观看 | 久久成人精品电影 | 日日干综合 | 天天干天天拍 | 国产啊v在线观看 | 久草a在线| 精品国产一区二区三区日日嗨 | 亚洲资源在线观看 | www.99久久.com| 中文字幕免费观看 | 97超碰在线久草超碰在线观看 | 日韩av手机在线看 | 丰满少妇麻豆av | 婷婷色中文字幕 | 亚洲一级黄色 | 97精品在线观看 | 色婷婷综合久久久久中文字幕1 | 国产一区二区不卡在线 | 超碰在线人人 | 久久婷婷丁香 | 在线蜜桃视频 | 亚洲成av人影院 | 精品久久久久久久久久岛国gif | 狠狠色丁香婷婷综合久小说久 | 天天色天天射天天操 | av丝袜天堂| 最新免费中文字幕 | 天天色天天搞 | 韩国av免费观看 | 91麻豆免费看 | 久久综合久色欧美综合狠狠 | 亚洲精品tv久久久久久久久久 | 天天摸日日操 | 九九九热精品免费视频观看 | av在线永久免费观看 | 五月婷婷电影网 | 在线观看欧美成人 | 日韩欧美aaa | 成人久久18免费 | 国产在线精品一区 | 麻豆视频国产 | 亚洲欧美日韩国产精品一区午夜 | 日韩欧美在线播放 | 日韩亚洲在线观看 | 国产一区二区三区免费在线观看 | 91av蜜桃| 国产麻豆剧传媒免费观看 | 亚洲一区二区视频在线播放 | 韩国av在线播放 | 国产传媒一区在线 | 免费高清av在线看 | 久久九九网站 | 亚洲女人天堂成人av在线 | 天天综合网久久 | 久久99久国产精品黄毛片入口 | 国产精品黄色在线观看 | 九九日韩 | 成人av中文字幕在线观看 | 天天综合网入口 | 亚洲精品成人网 | 欧美影片 | 玖玖在线看| 国产精品综合在线观看 | 国产免费视频一区二区裸体 | 麻豆视频在线免费看 | 欧美 亚洲 另类 激情 另类 | 国产精品免费一区二区三区在线观看 | 天天操天天射天天插 | 在线观看av麻豆 | 99久久久久国产精品免费 | 日韩在线观看免费 | 国产精品情侣视频 | 97精品视频在线 | 国产又粗又长又硬免费视频 | 中文字幕在线观看网站 | 日韩精品中文字幕一区二区 | 精品视频在线免费观看 | 国产五码一区 | 一区二区丝袜 | 蜜桃传媒一区二区 | 97精品在线视频 | 中文字幕在线日 | 日本中文字幕免费观看 | 午夜精品久久久久久中宇69 | 成人av在线影视 | 国产+日韩欧美 | 美女黄频在线观看 | 日韩有色 | 丁香5月婷婷 | 亚洲欧美日韩一区二区三区在线观看 | 免费日韩av电影 | 色综合久久久久网 | 日韩专区在线 | 在线 你懂 | 91精品视频在线免费观看 | 久操久 | 极品久久久久 | 久草在线免费在线观看 | 天天看天天干天天操 | 国产精品视屏 | 久久久久久国产精品亚洲78 | 欧美久久久 | 色综合久久久久 | www.久久久久 | 成人久久久精品国产乱码一区二区 | 天天综合网 天天综合色 | 精品一二三区视频 | 国产成人av电影在线观看 | www.色就是色 | 九九视频在线播放 | 久久综合免费视频影院 | av在线影片 | 久久激五月天综合精品 | 88av色| 91麻豆看国产在线紧急地址 | 麻豆精品传媒视频 | 激情综合久久 | 麻豆影视在线免费观看 | 五月激情在线 | 国产日产亚洲精华av | 日日日天天天 | 五月天天在线 | 久久精品国产免费看久久精品 | 精品国内自产拍在线观看视频 | 欧美日韩一级在线 | 一级黄色片毛片 | 91精品色| 成人在线视频你懂的 | 亚洲欧美日韩国产精品一区午夜 | 在线观看国产福利片 | 激情欧美一区二区免费视频 | 日韩色av色资源 | 国精产品满18岁在线 | 99热手机在线 | 999在线观看视频 | 国产正在播放 | 国产黄色片在线免费观看 | 国产精品久久久久久69 | 婷婷丁香社区 | 免费视频一区 | 超碰97在线资源站 | 一区二区激情 | 在线观看亚洲国产精品 | 日本高清久久久 | 久久高清| 国产精品99久久久久久宅男 | 欧美性生交大片免网 | 久久电影国产免费久久电影 | 日韩久久精品一区二区三区 | 精品人人人人 | 国产成人a亚洲精品v | 国产欧美最新羞羞视频在线观看 | 久久久免费电影 | 中文在线天堂资源 | 国内精品久久久久久久影视简单 | 国产精品久久在线 | 久久久精品一区二区三区 | 亚洲天天看 | 国产成人av一区二区三区在线观看 | 6080yy午夜一二三区久久 | 亚洲精品国精品久久99热 | 国产综合香蕉五月婷在线 | 天天爽综合网 | 久久激情五月丁香伊人 | 婷婷在线视频观看 | 视频福利在线 | 久久精品国产一区二区电影 | 99色在线视频 | 91高清完整版在线观看 | av在线免费观看不卡 | 精品久久久影院 | 中文字幕在线中文 | 在线有码中文字幕 | 国产手机视频在线播放 | 色婷婷88av视频一二三区 | 欧美国产日韩激情 | 色视频在线免费 | 日本黄色免费在线观看 | 国产又粗又猛又色又黄网站 | 国产专区第一页 | www在线观看视频 | 日韩黄色免费在线观看 | 久久免费视频精品 | 97国产大学生情侣白嫩酒店 | 久久观看最新视频 | 亚洲在线成人精品 | 2019天天干天天色 | 91麻豆精品国产91 | 欧美激情视频一区二区三区 | 91污在线| 亚洲视频久久 | 九九久久国产精品 | 蜜臀久久99精品久久久酒店新书 | 中文字幕日韩免费视频 | 狠狠操狠狠 | 丁香av| 久久亚洲国产精品 | 亚洲一区二区天堂 | 精品国产电影一区二区 | 国产品久精国精产拍 | 久久久精选 | av久久在线 | 日躁夜躁狠狠躁2001 | 粉嫩av一区二区三区入口 | 久久久久久久久久久影视 | 超碰av免费| 91精品国产欧美一区二区 | 碰天天操天天 | 久久精品系列 | 天天色综合1 | 国产精品久久婷婷六月丁香 | 久久久久女人精品毛片 | 日韩高清无线码2023 | av电影久久 | 欧美日韩精品二区第二页 | 少妇视频一区 | 欧美日本在线视频 | 精品日韩在线 | 91中文视频| 色综合久久88色综合天天人守婷 | 成年人视频在线免费观看 | 韩日三级av | 精品影院一区二区久久久 | 99亚洲国产精品 | 国产 视频 久久 | 91视频最新网址 | 天天操天天操天天操天天操 | 91精品福利在线 | 91精品啪| 亚洲91视频 | 色婷婷亚洲精品 | 天天看天天干 | 中文字幕免费一区二区 | av怡红院| 99久高清在线观看视频99精品热在线观看视频 | 久久精品网站视频 | 美女视频黄的免费的 | 99久久精品国产网站 | 色婷婷激婷婷情综天天 | 亚洲精品久久久蜜臀下载官网 | 日本久久视频 | 中文字幕欧美日韩va免费视频 | 久国产在线播放 | 亚洲精品一区二区18漫画 | 国产成人精品在线播放 | 免费观看成年人视频 | 久草免费在线视频观看 | 久久国产精品免费一区 | 国产免费区| 国产一级视频在线免费观看 | 色综合 久久精品 | 久久精品5| 成人a级免费视频 | 又紧又大又爽精品一区二区 | 97超碰在线久草超碰在线观看 | 制服丝袜亚洲 | 午夜天使 | 96超碰在线 | 国产成人精品久久久久 | 中文字幕在线高清 | www一起操| 久久人人爽人人爽人人片av免费 | 亚洲人毛片 | 婷婷色吧| 99久久99视频只有精品 | 成人午夜影视 | 日韩综合视频在线观看 | www国产在线| 免费亚洲婷婷 | 久久久久久久久福利 | 久久久久久久av麻豆果冻 | 中文字幕观看视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | www免费| 日韩高清在线一区二区 | 视频 天天草 | 亚洲三区在线 | 91毛片在线 | 成人av免费在线观看 | 精品在线视频观看 | 激情欧美一区二区免费视频 | 国产一二三四在线视频 | 五月天久久 | 国产中文字幕在线观看 | 国产精品免费看久久久8精臀av | 欧美高清视频不卡网 | 人人玩人人添人人澡97 | 玖玖视频| 久久99国产精品 | 综合视频在线 | 亚洲日本中文字幕在线观看 | 亚洲成人二区 | 美女久久视频 | 国产高清日韩欧美 | 国产精品久久久久久久久久 | 欧美色综合天天久久综合精品 | 中文免费 | 国产午夜精品理论片在线 | 国产在线资源 | 国产精品高潮呻吟久久久久 | 精品主播网红福利资源观看 | 亚洲精品福利在线 | 操操日 | 亚洲区视频在线观看 | 国产午夜精品久久 | av超碰在线 | 久草热久草视频 | 高潮久久久久久久久 | 成人中文字幕+乱码+中文字幕 | 日韩在线观看你懂的 | 天天天干天天射天天天操 | 香蕉在线观看视频 | 久久午夜影视 | 精品国产一区二区三区久久 | 国产96av | av在线网站免费观看 | 国产亚洲精品久久久久秋 | 91香蕉嫩草 | 日韩区在线观看 | 亚洲禁18久人片 | 久久婷婷综合激情 | 国产精品久久久久国产精品日日 | a v在线视频| 国产精品aⅴ | 又黄又爽的视频在线观看网站 | 中文字幕在线电影 | a黄色片在线观看 | 成人黄色中文字幕 | 国产精品成人av电影 | 99在线视频网站 | 日韩精品久久一区二区三区 | 一区二区精 | 国产精品99久久久久久久久久久久 | 国产精品毛片一区二区 | 欧美黑人性爽 | 亚洲精品午夜国产va久久成人 | 免费观看的av网站 | 91色国产在线 | 免费亚洲精品视频 | 欧美精品中文在线免费观看 | 亚洲精品在线国产 | 精品在线一区二区 | 国内小视频 | 欧美另类交在线观看 | 国产精品原创av片国产免费 | 天堂av在线 | 青青草国产免费 | 久草在线在线视频 | 亚洲久草在线 | 日韩欧美一区二区三区黑寡妇 | 91麻豆精品国产91久久久更新时间 | 天天曰 | 日韩理论在线视频 | 天天干夜夜夜 | 精品美女久久久久久免费 | 国产视频一二区 | 91专区在线观看 | 丁香花在线观看免费完整版视频 | 久久免费观看视频 | 国产视频在 | 香蕉影视app| 亚洲精品tv | 国产91学生粉嫩喷水 | 91亚洲精品国偷拍 | 日韩精品国产一区 | 欧美日韩久久久 | 啪啪激情网 | 久久精品99国产精品酒店日本 | 免费黄色av | 日韩在线视频不卡 | 中午字幕在线 | 国产成人91 | 亚洲一级电影在线观看 | 国产精品视频线看 | 亚洲砖区区免费 | 91香蕉视频| 日韩精品一区电影 | 午夜日b视频 |