【问题标题】:OpenCV - warpPerspectiveOpenCV - warpPerspective
【发布时间】:2017-08-18 17:07:46
【问题描述】:

我正在尝试将函数“warpPerspective”与 OpenCV 3.0 一起使用。我正在使用这个例子:

http://answers.opencv.org/question/98110/how-do-i-stitch-images-with-two-different-angles/

我必须在第一张图片的右侧创建一个 ROI,在第二张图片的左侧创建另一个。使用 ORB 提取和计算描述并匹配这些描述。我没有更改太多原始代码。只是投资回报率。

问题是我尝试扭曲透视的每张图像都是这样的:

我已经尝试了多对图像,但问题仍然存在。

#include "opencv2/opencv.hpp"
#include <iostream>
#include <fstream>
#include <ctype.h>

using namespace cv;
using namespace std;


int main(int argc, char* argv[])
{

Mat img1 = imread("image2.jpg");
Mat img2 = imread("image1.jpg");
namedWindow("I2", WINDOW_NORMAL); namedWindow("I1", WINDOW_NORMAL);

Ptr<ORB> o1 = ORB::create();
Ptr<ORB> o2 = ORB::create();
vector<KeyPoint> pts1, pts2;
Mat desc1, desc2;
vector<DMatch> matches;

Size s = img1.size();
Size s2 = img2.size();

Rect r1(s.width - 200, 0, 200, s.height);
//rectangle(img1, r1, Scalar(255, 0, 0), 5);
Rect r2(0, 0, 200, s2.height);
//rectangle(img2, r2, Scalar(255, 0, 0), 5);
Mat mask1 = Mat::zeros(img1.size(), CV_8UC1);
Mat mask2 = Mat::zeros(img1.size(), CV_8UC1);
mask1(r1) = 1;
mask2(r2) = 1;
o1->detectAndCompute(img1, mask1, pts1, desc1);
o2->detectAndCompute(img2, mask2, pts2, desc2);
BFMatcher descriptorMatcher(NORM_HAMMING, true);

descriptorMatcher.match(desc1, desc2, matches, Mat());
// Keep best matches only to have a nice drawing.
// We sort distance between descriptor matches
Mat index;
int nbMatch = int(matches.size());
Mat tab(nbMatch, 1, CV_32F);
for (int i = 0; i<nbMatch / 2; i++)
{
    tab.at<float>(i, 0) = matches[i].distance;
}
sortIdx(tab, index, SORT_EVERY_COLUMN + SORT_ASCENDING);
vector<DMatch> bestMatches;
vector<Point2f> src, dst;
for (int i = 0; i < nbMatch / 2; i++)
{
    int j = index.at<int>(i, 0);
    cout << pts1[matches[j].queryIdx].pt << "\t" << pts2[matches[j].trainIdx].pt << "\n";
    src.push_back(pts1[matches[j].queryIdx].pt + Point2f(0, img1.rows)); // necessary offset 
    dst.push_back(pts2[matches[j].trainIdx].pt);
}
cout << "\n";
Mat h = findHomography(src, dst, RANSAC);
Mat result;
cout << h << endl;

warpPerspective(img2, result, h.inv(), Size(3 * img2.cols + img1.cols, 2 * img2.rows + img1.rows));

imshow("I1", img1);
imshow("I2", img2);

Mat roi1(result, Rect(0, img1.rows, img1.cols, img1.rows));
img1.copyTo(roi1);
namedWindow("I3", WINDOW_NORMAL);
imshow("I3", result);
imwrite("result.jpg", result);
waitKey();
return 0;

这是否来自糟糕的匹配?我错过了什么吗?由于我对这个主题有点陌生,任何帮助或想法将不胜感激。

【问题讨论】:

  • 可以使用非倒排单应矩阵吗?
  • 问题仍然存在。现在,图像在第一张图像的另一侧以相同的纵横比拉伸。
  • 我只想说:answers.opencv.org 是开放和活跃的。我认为解决您的问题的最佳方法是询问@LBerger(代码作者)。如果您没有得到答案,那么您可以尝试其他方式。
  • 看起来像错误的单应性值,可能来自错误的匹配

标签: c++ opencv


【解决方案1】:

当你的扭曲视角不工作时,你需要快速检查一下——

  1. 您是否在两个图像中都选择了正确的点? 原因:您需要选择与每个点对应的完全相同的点 其他在寻找透视变换时。不相关的点毁了它。

  2. 您的点在数组中的顺序是否正确? R:你需要把它们在源和 到达 findhomography 之前的目的地。

  3. 你是否以正确的顺序通过 findHomography ?尝试切换 如果你不确定。所以这不会反向扭曲它

这些是我第一次使用它时犯的错误。现在,如果您看到您的图像,两个图像中都有一小部分重叠。你需要在那边更加小心。你的矩形面罩可能是问题所在。

【讨论】:

  • 我做到了。但是每次我执行程序时,它都会导致不同的匹配。有时它有效,有时则无效。应该存在某种模式吧?
  • 是的,这很公平。如果拼接图像只是您想要的,您是否尝试手动选择要缝合的点?就像你可以用鼠标选择点并缝合它们一样
  • 遗憾的是我必须自动进行特征检测。我将衷心感谢您的帮助。我已经知道如何开发拖放来获得投资回报率。我只是无法理解检测器使用的模式。
猜你喜欢
  • 2013-01-19
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2019-10-13
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多