问题描述
我正在拼接三张图片。现在我想在左侧(图像 A 和 B)和右侧(图像 B 和 C)实施扭曲透视。我能够计算两个 H 矩阵,但有一些奇怪的行为。 当我计算 A + B + C 时,它会先执行 B + C,然后执行 A + B。这里 AB 的 H 矩阵不正确,但我不知道为什么!
当我只做 A+B 时,我会收到“正确的值”。我尝试了一切,所以我来到了这里。在计算 B+C 之后似乎有一些垃圾,但即使我尝试了 .clear() 和 .release() 一切,仍然表现相同,我也尝试在任何地方使用 .clone() - 没有帮助。我还检查了是否输入了正确的图像,是的。
我会尽量简化我的代码:
// Stitcher variables
std::vector<std::pair<Mat,Mat>> images_toCalc;
std::vector<Mat> images;
std::vector<Mat> Hs;
//MAIN
images[2] = imread("E:/JOB/StitchingProject/StitchingApp/x64/Debug/i/left.jpg");
images[1] = imread("E:/JOB/StitchingProject/StitchingApp/x64/Debug/i/mid.jpg");
images[0] = imread("E:/JOB/StitchingProject/StitchingApp/x64/Debug/i/right.jpg");
stitcher->setImages(images,3);
stitcher->runStitching2(false);
// runStitching2
for (int i = 0; i < this->images.size() - 1; i++) {
Mat image1 = this->images.at(i).clone();
Mat image2 = this->images.at(i + 1).clone();
//if (true) {
if (!isHalfAlready(i)) {
flip(image1,image1,1);
flip(image2,image2,1);
this->images_toCalc.push_back(std::make_pair(image2.clone(),image1.clone()));
}
else {
this->images_toCalc.push_back(std::make_pair(image1.clone(),image2.clone()));
}
}
for (int i = 0; i < images_toCalc.size(); i++) {
Mat H;
H = this->calcH(images_toCalc.at(i).first,images_toCalc.at(i).second);
this->Hs.push_back(H);
H.release();
if (this->debugLevel[3]) cout << "[" << i << "] H" << endl << Hs.at(i) << endl;
}
现在是越野车部分
// this->calcH
Mat heStitcher::calcH(Mat& image1_toCalc,Mat& image2_toCalc) {
std::vector< KeyPoint > keypointsObject,keypointsScene;
Mat descriptorsObject,descriptorsScene;
Mat image1,image2;
image1 = image1_toCalc.clone();
image2 = image2_toCalc.clone();
if (greyCalc) {
cv::cvtColor(image1,cv::COLOR_BGR2GRAY);
cv::cvtColor(image2,cv::COLOR_BGR2GRAY);
}
Ptr<SURF> detector = SURF::create();
detector->detectAndCompute(image1,Mat(),keypointsObject,descriptorsObject);
detector->detectAndCompute(image2,keypointsScene,descriptorsScene);
detector->clear();
vector<std::vector<DMatch>> matches;
Ptr<FlannBasedMatcher> matcher = cv::FlannBasedMatcher::create();
matcher->knnMatch(descriptorsObject,descriptorsScene,matches,2);
matcher->clear();
double min_dist = 100;
double max_dist = 0;
std::vector< DMatch > goodMatches;
for (size_t i = 0; i < matches.size(); i++) {
if (matches[i][0].distance < 0.75f * matches[i][1].distance) {
goodMatches.push_back(matches[i][0]);
}
}
std::vector< Point2f > obj;
std::vector< Point2f > scene;
for (int i = 0; i < goodMatches.size(); i++) {
obj.push_back(keypointsObject[goodMatches[i].queryIdx].pt);
scene.push_back(keypointsScene[goodMatches[i].trainIdx].pt);
}
cv::Mat H;
cv::Mat H2;
if (obj.size() < 4) {
if (this->debugLevel[2]) cout << endl << "!!!!!! not enough similarities (less than 4) !!!!!!" << endl;
}
else {
H = findHomography(obj,scene,RANSAC);
}
image1.release();
image2.release();
descriptorsObject.release();
descriptorsScene.release();
keypointsObject.clear();
keypointsScene.clear();
obj.clear();
scene.clear();
goodMatches.clear();
matches.clear();
H2 = H.clone();
H.release();
return H2;
}
在这个warpPerspective、边界切割等之后,结果是图1a 2中的矩阵。(显然矩阵不正确的地方)。我无法理解,为什么在使用相同的脚本和相同的程序时,我得到了不同的结果。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)